Приветствую Вас, Гость! Регистрация RSS

Мой сайт

Среда, 22.11.2017
Главная » 2011 » Октябрь » 27 » ответы на зачет по C#
14:44
ответы на зачет по C#

1)Типы данных, литералы и переменные (типы значений, целочисленные типы, типы для представления чисел с плавающей точкой, символы, логический тип, литералы; инициализация переменной, неявно типизированные переменные, область действия и время существования переменных, приведения типов).

2) операторы (арифметические операторы, операторы отношения и логические операторы, оператор присваивания, оператор ?)

3) управляющие операторы (if, switch, for, while, do-while, foreach, break, continue, return).

4) массивы и строки (виды массивов, инициализация массивов, неявно типизированные массивы; постоянство строк).

5) классы, объекты и методы (общая форма определения класса, создание объектов, конструкторы, оператор new, сборка мусора, модификация доступа, инициализация объектов, рекурсия, псевдорекурсия, статические классы).

6) методы (использование параметров метода, модификаторы параметров ref и out, использование переменного числа аргументов, перегрузка методов, необязательные аргументы, метод Main(), статические методы)

7) перегрузка операторов (перегрузка унарных и бинарных операторов, операторов отношения, true и false, логических операторов, операторов преобразования).

8) индексаторы и свойства (одномерные и многомерные индексаторы, перегрузка индексаторов; автосвойства, модификаторы доступа в аксессорах).

9)наследование (организация защищенного доступа, конструкторы и наследование, сокрытие имен, виртуальные методы, абстрактные классы, ключевое слово sealed, класс object, упаковка и распаковка).

10) интерфейсы (реализация, применение интерфейсных ссылок, наследование интерфейсов, явные реализации).

11) структуры и перечисления

12) обработка исключительных ситуаций (класс System.Exception,ключевые слова try, catch, throw, finally).

13)делегаты и события (объявление делегатов, групповая адресация, ковариантность и контрвариантность, анонимные методы, события, групповая адресация события, аксессоры событий).

14) обобщения (объявление, ограниченные типы, полученные значения, присваиваемого параметру типа по умолчанию, обобщенный метод, вариантные делегаты).

1) Типы данных, литералы и переменные

Термин «тип значения» применяется к переменным, которые непосредственно содержат значения. (для сравнения: переменные ссылочных типов содержат ссылки на реальные значения)

В C# определено 9 целочисленных типов: char, byte, sbyte, short, ushort, int, uint, long, ulong. Однако тип Char в основном используется для предоставления символов. Остальные восемь предназначены для числовой обработки данных.

Типы с плавающей точкой могут представлять числа с дробными компонентами. Таких типов только два: Float и double. Для значений типа float используется 32 бита, которые позволяют представлять числа в диапазоне от 1,5Е-45 до 3,4Е+38. Для значений типа double(т.е удвоенной точности) используется 64 бита, позволяющий представить числа в диапазоне от 5Е-324 до 1,7Е+308.

В C# символы представляются 16-разрядными величинами(в диапазоне 0-65535), что позволяет представлять все существующие в мире алфавиты. Используется Unicode.

char ch;

ch = ‘X’;

Console.WriteLine("это ch: ” + ch);

Тип bool представляет значения ИСТИНА\ЛОЖЬ, которые в C# определяются зарезервированными словами true и false. Переменная или выражение будет иметь только одно из этих двух значений. В C# не определено ни одно преобразование значения типа bool в целочисленное значение.

Литералы – фиксированные значения, представленные в понятной форме. Так же называют константами.

Литералы могут иметь любой тип значений. Способ их представления зависит от их типа.

Если тип, задаваемый по умолчанию, не соответствует вашим намерениям в отношении типа конкретного литерала, вы можете явно определить его с помощью нужного суффикса. Чтобы задать литерал типа long, присоедините к его концу букву L или l. Целочисленное значение без знака – суффикс u или U. Длинное целое без знака – ul или UL. ( 234234UL )

Общий формат инициализации переменной:

Тип имя_переменной = значение;

Как правило, переменные, объявленные в некоторой области видимости, невидимы (т.е. недоступны) для кода, который определяется вне этой области видимости. Т.о., при объявлении переменной внутри области вы локализируете ее и защищаете от неправомерного доступа и\или модификации. Эти правила обеспечивают основу для инкапсуляции.

Области видимости могут быть вложенными. Объекты объявленные внутри внешней области, будут видимы для кода внутренней области, но не наоборот.

Переменные создаются после входа в их область видимости, и разрушаются при выходе из нее. Переменная не будет хранить значение за пределами области видимости

При присвоении значения одного типа данных переменной другого типа будет выполнено автоматическое преобразование типов, если

-эти два типа совместимы;

-тип приемника больше чем тип источника.

Приведение к типу – это явно заданная инструкция преобразовать один тип в другой.

double x,y;

//…

(int) (x / y) ;

2) операторы (арифметические операторы, операторы отношения и логические операторы, оператор присваивания, оператор ?)

В C# имеется четыре общих класса операторов: арифметические, поразрядные, логические и операторы отношений.

Арифметические операторы:

Инкремент . х = х +1 аналогично х++

Операторы отношений оценивают по «двубальной системе» (истина\ложь) отношения между двумя значениями, а логические определяют различные способы сочетания истинных и ложных значений. Результат выполнений имеет тип bool.

Операторы отношений:

Список логических операторов

Оператор присваивания. Переменная = выражение;

Тип элемента переменная должен быть совместим с типом элемента выражение.

Позволяет создавать целую цепочку присвоений: x = y = z = 100;

Составные операторы присваивания. х = х + 10; можно записать в таком виде: х += 10; и т.п.

Оператор ? Часто используется для замены типов инструкций if-else.

Выражение1 ? Выражение2 ? Выражение3;

Вычисляется выражение1, если оно истинно то вычисляется выражение2,и результат его выполнения становится значением всего ?-выражения. если ложно то вычисляется выражение3.

Пример z = (a > b) ? a : b; /* z = max(a, b)*/

3) управляющие операторы (if, switch, for, while, do-while, foreach, break, continue, return).

Существуют три категории управляющих инструкций: инструкции выбора(if, switch), итерационные инструкции(Циклы for, while, do-while и foreach) инструкции перехода (break, continue, goto, return и throw).

if (условие) {инструкции-1}else {инструкции-2}

Оператор switch предназначен для организации выбора из множества различных вариантов. Формат оператора следующий:

switch ( выражение ) {

:

[ case константное-выражение1]: [ список-операторов1]

[ case константное-выражение2]: [ список-операторов2]

: :

[ default: [ список операторов ]] }

Оператор break обеспечивает прекращение выполнения самого внутреннего из объединяющих его операторов switch, do, for, while. После выполнения оператора break управление передается оператору, следующему за прерванным.

Оператор continue, как и оператор break, используется только внутри операторов цикла, но в отличие от него выполнение программы продолжается не с оператора, следующего за прерванным оператором, а с начала прерванного оператора.

Оператор for - это наиболее общий способ организации цикла. Он имеет следующий формат:

for ( выражение 1 ; выражение 2 ; выражение 3 ) тело

Выражение 1 обычно используется для установления начального значения переменных, управляющих циклом. Выражение 2 - это выражение, определяющее условие, при котором тело цикла будет выполняться.

Выражение 3 определяет изменение переменных, управляющих циклом после каждого выполнения тела цикла.

Схема выполнения оператора for:

1. Вычисляется выражение 1.

2. Вычисляется выражение 2.

3. Если значения выражения 2 отлично от нуля (истина), выполняется тело цикла, вычисляется выражение 3 и осуществляется переход к пункту 2, если выражение 2 равно нулю (ложь), то управление передается на оператор, следующий за оператором for.

Существенно то, что проверка условия всегда выполняется в начале цикла. Это значит, что тело цикла может ни разу не выполниться, если условие выполнения сразу будет ложным.

Пример: int main() { int i,b; for (i=1; i<10; i++) b=i*i;

return 0; }

Оператор цикла while называется циклом с предусловием и имеет следующий формат:

while (выражение) тело ;

В качестве выражения допускается использовать любое выражение языка Си, а в качестве тела любой оператор, в том числе пустой или составной. Схема выполнения оператора while следующая:

1. Вычисляется выражение.

2. Если выражение ложно, то выполнение оператора while заканчивается и выполняется следующий по порядку оператор. Если выражение истинно, то выполняется тело оператора while.

3. Процесс повторяется с пункта 1.

Оператор цикла do while называется оператором цикла с постусловием и используется в тех случаях, когда необходимо выполнить тело цикла хотя бы один раз. Формат оператора имеет следующий вид: do тело while (выражение);

Схема выполнения оператора do while :

1. Выполняется тело цикла (которое может быть составным оператором).

2. Вычисляется выражение.

3. Если выражение ложно, то выполнение оператора do while заканчивается и выполняется следующий по порядку оператор. Если выражение истинно, то выполнение оператора продолжается с пункта 1.

Чтобы прервать выполнение цикла до того, как условие станет ложным, можно использовать оператор break.

Операторы while и do while могут быть вложенными.

Пример: int i,j,k; ... i=0; j=0; k=0;

do { i++; j--; while (a[k] < i) k++; }

while (i<30 && j<-30);

цикл foreach предназначен для опроса элементов коллекции. Коллекция – группа объектов. Например массив..

goto – инструкция безусловного перехода. При ее выполнении управление программой передается инструкции указанной с помощью метки. Метка должна находиться в одном методе с инструкцией goto.

4) массивы и строки (виды массивов, инициализация массивов, неявно типизированные массивы; постоянство строк).

Массивы – коллекция переменных одинакового типа, обращение к которым происходит с использованием общего для всех имени.

Одномерный массив – список связанных переменных

Тип[] имя_массива = new тип[размер]; тип – базовый тип массива. Размер – количество элементов.

Многомерные. а) двумерные если представить в виде таблицы, то один индекс означает строку, а второй столбец.

Int[,] table = new int[10,20]; б) трех и более измерений тип[, .. , ] имя = new тип[размер1, .. , размерN];

Инициализация

Int[4,3] a = { 0,1,2,3,4,5,6,7,8,9,10,11 };

Int[,] a={{0,1,2},{3,4,5},{6,7,8},{ 9, 10, 11 }};

Строки – тип string – предназначен для определения и поддержки символьных строк. В C# строки являются объектами. Т.о. string – это ссылочный тип.

string str = "какая то строка ”;

подобно другим типам данных, строки могут быть собраны в массивы. Н-р: string[] str = {"это”, "массив”, "строк”};

постоянство строк . содержимое string-объектов неизменно. Другими словами, последовательность символов, составляющих строку, изменить нельзя.

5) классы, объекты и методы (общая форма определения класса, создание объектов, конструкторы, оператор new, сборка мусора, модификация доступа, инициализация объектов, рекурсия, псевдорекурсия, статические классы).

Класс – это шаблон, который определяет форму объекта. Он задает как данные, так и код, который оперирует этими данными. Объект – экземпляр класса.

Класс создается с помощью ключевого слова class.

Общая форма имеет вид:

class имя_класса {

//объявление переменных экземпляров.

Доступ тип переменная1;

Доступ тип переменная2; ….

Доступ тип переменнаяN;

//объявление методов

Доступ тип_возврата метод1 (параметры) { тело метода } …

}

Создание объекта

Имя_класса имя_объекта = new имя_класса();

или в виде двух инструкций:

имя_класса имя_объекта; //объявление ссылки на объект.

имя_объекта = new имя класса(); //выделение памяти для объекта.

Для доступа к переменным экземпляра используется оператор «точка» (.)

Методы – это процедуры, которые манипулируют данными в классе, и во многих случаях обеспечивают доступ к этим данным.

Конструктор инициализирует объект при его создании. Он имеет такое же имя как и класс, синтаксически подобен методу. В определении конструкторов не указывается тип возвращаемого значения. Формат записи:

Доступ имя_класса() { //тело конструктора }

Обычно используется чтобы придать переменным экземпляра класса начальные значения, или выполнить определенные действия, необходимые для создания полностью сформированного объекта

Оператор new

Переменная_типа_класса = new имя_класса();

Переменная_типа_класса – имя создаваемого объекта. Имя_класса() - конструктор

При использовании оператора new объектам динамически выделяется свободная память.

Система сбора мусора C# автоматически возвращает память для повторного использования, действуя незаметно и без вмешательства программиста. Если не существует ни одной ссылки на объект, то предполагается что объект больше не нужен, и занимаемая память освобождается.

Public - общие компоненты класса и они доступны за пределами класса в любом месте программы

Protected - защищенные компоненты класса. они доступны компонентным функциям не только данного класса но и его потомкам. при отсутствии наследования интерпретируются как внутренние.

Private - внутренние компоненты класса. доступны только компонентным функциям того же класса.

Internal – доступ к переменным внутри данного файла (.cs)

В C# метод может вызывать сам себя- рекурсия. А метод рекурсивный.

В общем случае Рекурсия – это процесс определения чего-либо с использованием самого себя.


статические классы – классы содержащие только статические функции. Экземпляр такого класса не может быть создан с использованием оператора new, поскольку все члены статичны и доступны с использованием имени этого класса.

Если член объявлен как static, к нему можно получить доступ до создания объектов этого класса и без ссылки на объект.

На static-методы накладываются ряд ограничений: 1) не имеет ссылки this. 2) может вызывать напрямую только static-методы. 3) должен получать прямой доступ только к static-данным.

6) методы (использование параметров метода, модификаторы параметров ref и out, использование переменного числа аргументов, перегрузка методов, необязательные аргументы, метод Main(), статические методы)

Методы – это процедуры, которые манипулируют данными в классе, и во многих случаях обеспечивают доступ к этим данным.

Формат записи:

доступ тип_возврата имя( ref\out список_параметров) { // тело метода }

параметры – это переменные, которые получают значения аргументов, передаваемых методу при вызове.

ref – заставляет C# организовать вместо вызова по значению вызов по ссылке. Ref используется при объявлении метода и его вызове.

out – подобен ref за одним исключением: его можно использовать только для передачи значения из метода. Не нужно присваивать переменной, используемой в качестве out-параметра, начальное значение до вызова метода. Более того, предполагается, что out-параметр всегда поступает в метод без начального значения, но метод до своего завершения обязательно должен присвоить этому параметру значение.

Использование переменного количества аргументов

Используется когда необходимо произвольное число аргументов. это реализуется с помощью модификатора params. Модификатор params используется для объявления параметра-массива, который сможет получить некоторое количество аргументов (в том числе и нулевое). Количество элементов в массиве будет равно числу аргументов, переданных методу.

Public int A(params int[] b) {.. }

Перегрузка методов. – ситуация когда два или больше методов внутри одного класса имеют одинаковое имя, но разные параметры.

В общем случае для перегрузки метода достаточно объявить еще одну его версию. Но их параметры должны отличаться по типу и\или количеству. При вызове метода выполнится та его версия, параметры которой совпадают с заданными аргументами.

Main() Возвращение значения из метода Main() по завершении программы можно возвратить значение вызывающему процессу ( часто в его роли – ось). Для этого исп такая форма: public static int Main()

Обычно значение, возвращаемое методом Main(), служит индикатором того, как была завершена программа (нормально или аварийно)

Многие программы принимают аргументы из командной строки. Аргументы командной строки – это инфа, которая указывается при запуске программы сразу после ее имени в командной строке.

Используется такая форма записи: public static void\int Main(string[] args)

Если член объявлен как static, к нему можно получить доступ до создания объектов этого класса и без ссылки на объект.

На static-методы накладываются ряд ограничений: 1) не имеет ссылки this. 2) может вызывать напрямую только static-методы. 3) должен получать прямой доступ только к static-данным.

7) перегрузка операторов (перегрузка унарных и бинарных операторов, операторов отношения, true и false, логических операторов, операторов преобразования).

Перегрузка операторов – определение значения оператора относительно создаваемого класса.

Для перегрузки исп ключевое слово operator, позволяющее создать операторный метод, который определяет действие оператора, связанное с его классом.

Есть две формы – одна для унарных операторов, другая – для бинарных. общая форма для унарного оператора: Public static тип_возврата operator op (тип_параметра операнд) { … }

Для бинарного:

Public static тип_возврата operator op (тип_параметра1 операнд1, тип параметра2 операнд2) { … }

Операторы отношений так же можно перегружать. Как правило, перегруженный оператор отношения возвращает или true или false. Операторы отношений перезагружать можно только парами. Перегружая >, так же нужно перегрузить < ; == и !=; <= и >=.

Ключевые слова true и false в целях перегрузки также можно использовать в качестве унарных операторов. Они будут иметь специфическое определение понятий ИСТИНА и ЛОЖЬ в отношении создаваемых классов. Их перегружают в паре.

Имеют такой формат:

Public static bool operator true (тип_параметра op) { //возврат значения true или false }

Перегрузка логических операторов.

Логические операторы &, |, !, &&, ||. Безусловно могут быть перегружены только &, |, !.

&&, || перегружаются по сокращенной схеме.

Для этого необходимо соблюдать четыре правила. 1) класс должен перегружать операторы & и | 2) & и | - методы должны возвращать объект класса, для которого перегружаются эти операторы. 4) тот же класс должен перегружать операторы false и true.

Операторы преобразования. Иногда объект класса нужно использовать в выражении включающем другие типы данных. Такие средства может обеспечить перегрузка одного или нескольких операторв. Но в некоторых случаях желаемого результата можно достичь за счет преобразования типов(из классового в нужный). В таких ситуациях C# позволяет создавать специальный тип операторного метода operator, именуемого оператором преобразования. Такой оператор преобразования перегружает объект некоторого класса в значение другого типа.

Сущ. Две формы операторов преобразования: явная и неявная. В общем виде:

Public static explicit operator тип_результата (исходный_тип v) [return значение;]

Public static implicit operator тип_результата (исходный_тип v) [return значение;]

v – значение класса после преобразования.

Если explicit, то преобразование выполняется автоматически, т.е. при использовании объекта в выражении включающем данные типа тип_результата.

Если implicit, то преобразование выполняется при использовании оператора приведения типов.

Для одной и той же пары типов нельзя определить как explicit -, так и implicit-оператор преобразования.

8) индексаторы и свойства (одномерные и многомерные индексаторы, перегрузка индексаторов; автосвойства, модификаторы доступа в аксессорах).

Индексатор позволяет обеспечить индексированный доступ к объекту. Главное назначение – поддержать создание специализированных массивов, на которые налагается одно или несколько ограничений.

Одномерные индексаторы имеют такой формат:

Тип_элемента this [int индекс] {

// аксессор считывания данных.

Get {//возврат значения, заданного элементом индекс }

//аксессор установки данных

Set { //установка значения, заданного элементом индекс.} }

Тип_элемента – базовый тип индексатора. Это тип каждого элемента, к которому предоставляется доступ посредством индексатора.

Параметр индекс получает индекс опрашиваемого или устанавливаемого элемента.

Аксессор подобен методу за исключением того, что в нем отсутствует объявление типа возвращаемого значения и параметров. При использовании индексатора аксессоры вызываются автоматически, и в качестве параметра принимают индекс.

Многомерные индексаторы. Тип_элемента this [int индекс1, int индекс2] {}

Индексатор можно перегрузить. Из двух определенных в классе индексаторов будет выполнятся тот, для которого окажется наилучшим соответствие типов параметра индексатора и его аргумента, используемого в качестве индекса.

Свойства – специальный тип членов класса. Включает поле и методы доступа к этому полю.

Во многом напоминает индексаторы. Основное достоинство свойства – его можно использовать в выражениях и инструкциях присваивания подобно обычной переменной, хотя в действительности здесь будут вызываться get- и set-аксессоры.

Формат записи:

Модификатор Тип имя {

Get { //код аксессора чтения поля }

Set {// код аксессора записи поля}

}

Аксессор set автоматически принимает параметр с именем value, который содержит значение, присваиваемое свойству.

Свойства не определяют область памяти. Свойство управляет доступом к полю, но самого себя не обеспечивает. Это поле должно быть задано независимо от свойства.

Автосвойство – не ссылается на какую-нибудь переменную, оно работает само по себе.

Модификаторы доступа. Public – доступно для любых классов. private- только для данного класса .protected- .только для данного класса и его производных Internal – доступ к переменным внутри данного файла (.cs)

9)наследование (организация защищенного доступа, конструкторы и наследование, сокрытие имен, виртуальные методы, абстрактные классы, ключевое слово sealed, класс object, упаковка и распаковка).

Наследование – один из трех фундаментальных принципов ооп.

Class имя_производного_класса: имя_базового_класса { тело_класса }

Использование защищенного доступа

C# позволяет создавать защищенные члены, которые открыты для своей иерархии класса, но закрыты вне класса. Защищенные члены создаются при помощи модификатора protected.

Закрыт до того, пока этот член не наследуется. После этого он становится защищенным в производном классе. Для private действие не работает.

Конструкторы и наследование. Конструктор базового класса создает часть объекта соответствующую базовому классу, а конструктор производного класса – производную базового класса, и не видит или не имеет доступа к элементам производного класса.

Форма вызова конструктора базового класса:

Конструктор_производного_класса (список_параметров) : base (список_аргументов) { .. }

Наследование и закрытие имен. Производный класс может определить член, имя которого совпадает с именем члена базового класса. В этом случае член базового класса становится сокрытым в производном классе. Но компилятор будет выдавать предупреждающее сообщение. Для предотвращения этого перед членом производного класса необходимо поставить ключевое слово new .

Виртуальные методы- метод объявляемый с помощью ключевого слова virtual в базовом классе и определенный в одном или нескольких производных классах. Если базовый класс содержит виртуальный метод, и из этого класса выведен производный класс, то при наличии ссылки на различные типы объектов будут выполнятся различные версии этого виртуального метода.

Какую именно версию метода нужно вызвать, C# определяет по типу объекта, на который указывает эта ссылка, причем решение принимается динамически, во время выполнения программы.

Т.о. если базовый класс содержит виртуальный метод и из этого класса выведены производные классы, то при наличии ссылки на различные типы объектов (посредством ссылки на базовый класс) будут выполнятся различные версии этого виртуального метода.

Абстрактные классы

Своего рода «пустой бланк», который унаследуют все производные классы, причем каждый из них заполнит этот бланк собственной информацией. Такой класс определяет суть методов, которые производные классы должны реализовать, но сам при этом не обеспечивает реализации одного или нескольких методов.

Чтобы переопределить методы, которые в базовом классе не имеют никакого смысла используются абстрактные методы. - создаются с помощью модификатора abstract, они не содержат тела и не реализуются базовым классом. Производный класс должен его переопределить т.к. не может использовать версию предложенную в базовом классе.

Формат записи:

abstract тип.имя ( список_параметров )

abstract не реализуется в полном объеме, и не возможно создать его экземпляры или объекты.

Абстрактный метод автоматически явл. Виртуальным и совместное использование модификаторов virtual и abstract считается ошибкой.

Sealed

Чтобы запретить наследование класса, предварить его объявление ключевым словом sealed.

Формат записи:

Sealed class A { // .. }

Class B : A { .. } – класс А не может иметь наследников.

Класс object – Является неявным классом всех других классов и типов. Object – еще одно имя для класса system.object, который является частью библиотеки классов .NET Framework.

10) интерфейсы (реализация, применение интерфейсных ссылок, наследование интерфейсов, явные реализации).

Интерфейсы синтаксически подобны абстрактным классам. Он определяет, что должно быть сделано, но не уточняет как. Интерфейс объявляется с помощью ключевого слова interface

Упрощенная форма объявления:

Interface имя { тип_возврата имя_метода1 (список_параметров);

Тип_возврата имя_метода2(список_параметров);

.. }

Реализация

Class имя_класса : имя_интерфейса {// тело класса }

Класс может реализовываться несколькими интерфейсами. Методы реализуемые интерфейсами должны быть открыты.

Применение интерфейсных ссылок. Переменная может ссылаться на любой объект который реализуется ее интерфейсом. При вызове метода для объекта посредством интерфейсной ссылки будет выполнятся та версия указанного метода, которая реализуется этим объектом.

Public interface ISeries {

Int getNext(); //возвращает следующее число ряда.

Void reset(); //выполняет перезапуск

Void setStart(int x); // устанавливает начальное значение. }

Наследование интерфейсов один интерфейс может наследовать богатство другого. Синтаксически аналогичен синтаксису, используемому для унаследования классов. Если класс реализует интерфейс, который наследуется другим интерфейсом, то этот класс должен обеспечить способность реализации для всех членов определенных внутри цепочки наследования интерфейсов.

Public interface A { .. }

Public interface B : A { .. }

Явная реализация

При реализации члена интерфейса можно квалифицировать его имя с использованием имени интерфейса. Говорят что член интерфейса реализуется явным образом или имеет место его явная реализация.

Class MyClass : IMyIF {

Int IMyIF.myMeth (int x) { return x/3 }

}

Явная реализация членов интерфейса может понадобится по двум причинам. Во первых, реализуя метод с использованием полностью квалифицированного имени, вы тем самым обозначаете части закрытой реализации, которые не видны коду, определенному вне класса. Во вторых, класс может реализовать два интерфейса, которые объявляют методы с одинаковыми именами и типами. Полная квалификация имен позволяет избежать неопределенности ситуации.

11) структуры и перечисления

Структуры подобны классу, но они относятся к типу значений, а не к ссылочным типам. Объявляются с помощью слова struct и синтаксически подобны классам. Не могут наследовать другие структуры или классы.

Формат записи:

Struct имя : интерфейсы { // объявление членов }

Структура может реализовать один или несколько интерфейсов. Они указываются после имени структуры и отделяются запятыми. Членами структур могут быть методы, поля. Индексаторы, свойства, операторные методы, события, конструкторы.

Благодаря прямому доступу к структурам, при работе с ними не снижается производительность. Расходуется меньший объем памяти.

Перечисление – множество именованных целочисленных констант. Формат записи:

Enum имя { список_перечисления };

список_перечисления – список идентификаторов, разделенных запятыми, каждый означает целое число, причем следующее на 1 больше предыдущего.

Доступ – через точку. Имя.элемент.

12) обработка исключительных ситуаций (класс System.Exception,ключевые слова try, catch, throw, finally).

исключительная ситуация(или исключение) – ошибка, которая возникает во время выполнения программы.

Преимущество подсистемы обработки исключений состоим в автоматизации создания большой части кода, который ранее необходимо было вводить в программы «вручную». Обработка исключений упрощает «работу над ошибками», позволяя в программах определять блок кода, именуемый обработчиком исключений, который будет автоматически выполняться при возникновении определенной ошибки.
класс System.Exception

В C# исключения представляются классами. Все классы исключений должны быть выведены из встроенного класса исключений Exception, который является частью пространства имен system.

Из класса Exception выведены классы systemException и ApplicationException. Они поддерживают две общие категории исключений, определенные в C#: те, которые генерируются C#-системой динамического управления, или общеязыковым средством управления (Common Language RuntimeCLR), и те которые генерируются прикладными программами. Они определяют вершины двух различных иерархий классов исключений.

Управление C#-механизмом обработки исключений держится на четырех исключающих словах: try, catch, throw и finally. Они образую взаимосвязанную подсистему, в которой использование одного из них предполагает использование другого.

Использование try и catch блоков. Ядром обработки исключений являются блоки try и catch они работают в одной связке. Формат try {блок кода подлежащий проверки на наличие ошибок}

Catch (ExcepType1 exOb){ обработка для исключения ExcepType1} Catch (ExcepType2 exOb){ обработка для исключения ExcepType2 }

ExcepType – тип сгенерированного исключения. Как видно из формата записи try\catch-блоков, c try-блоками связанны не одна, а несколько catch блоков. И будет выполнятся та кетч инструкция, тип исключения которой совпадает с типом сгенерированного исключения. После перехвата параметра exOb принимает его значения.

Блок finally.исключение может вызвать ошибку, которая завершит текущий метод. И является причиной преждевременного возврата. Однако оставленный открытый файл или соединение с сетью необходимо закрыть.

Общая форма записи последовательности try и catch блоков, содержащей блок finally, выглядит так:

Try { // блок кода, предназначенный для обработки ошибок. }

Catch (ExceptType1 exOb ) {// обработчик для исключения типа ExceptType1}

Catch (ExceptType1 exOb ) {// обработчик для исключения типа ExceptType2}

..

Finally {//код завершения обработки исключений}

Блок throw

Генерирование исключения вручную.

Throw exceptOb – объект который исключается

13)делегаты и события (объявление делегатов, групповая адресация, ковариантность и контрвариантность, анонимные методы, события, групповая адресация события, аксессоры событий).

Делегат – объект который может ссылаться на метод. Создаем делегат – создаем объект, ссылку на метод. Метод, который будет вызван делегатом, определяется не в процессе компиляции а во время ее работы. Delegate тип_возврата имя (список_параметров).

Тип_возврата – тип значения возвращаемого методами, которые этот делегат будет вызывать. Параметры принимаемые методами, которые вызываются по средствам делегата, задаются с помощью списка параметра. Может вызывать только те методы, у которых тип возвращаемого значения, и список параметров совпадают с соответствующими элементами объявленного делегата. Делегат может вызвать метод на который ссылается.

Анонимный метод

Позволяет отказаться от использования списка параметров. Означает что анонимный метод может быть преобразован в делегаты, с различным синтаксисом. Использование анонимных методов позволяет сократить издержки на кодирование при создании делегатов, поскольку не требует создание отдельных методов.

Delt = delegate (int k) {}

События –автономное уведомление о выполнении некоторых действий. Объект, который необходимо информировать о некотором событии регистрирует обработчик для этого события. Когда ожидаемое событие происходит, вызываются все зарегистрируемые обработчики(делегаты).

Event – событийный_делегат объект

Событийный_делегат – имя делегата, объект – имя события.

Групповая адресация события.

Подобно делегатам события могут предназначаться для многоадресной передачи.

Формат записи

Имя.имя_события +=new имя_делегата (xOb.xhandler) итд

Аксессоры событий.

Чтобы управлять списком обработчиков событий используют вторую форму event-инструкции. Которая позволяет использовать средства доступа к событиям.

Форма записи:

Event событийный_делегат имя_события {add {//добавляем события}remove {//удаление}}

Add - +=; remove - -=.

14) обобщения (объявление, ограниченные типы, полученные значения, присваиваемого параметру типа по умолчанию, обобщенный метод, вариантные делегаты).

С помощью синтаксического обобщения можно определить тип в зависимости от другого типа. Который не специфичен в точке определения, а вместо этого определен в точке использования обобщенного типа.

Collection <int> numbers = new collection<int>();

Public class MyCollection <T> {private T [] storage}

<T> тип внутри коллекции как неутонченный тип

Ограниченные типы

На базовый класс интерфейс конструктор без параметров, типы значений и типы ссылок.

Присвоение параметров ссылок по умолчанию

obj = default (T)

Категория: Другое | Просмотров: 2393 | Добавил: Ghost | Теги: ответы, си шарп, программирование, C#
Всего комментариев: 0
Имя *:
Email *:
Код *:
!!!