- •1. Жизненный цикл объекта.
- •2.Делегаты. Назначение, синтаксис объявления, использование делегата. Событийная модель.
- •3. События. Объявление события. Шаблон проектирования события в классе. Свойство для безопасной работы с событиями. Безопасный вызов события в многопоточном программировании.
- •4. Обобщенные классы. Объявление и детализация класса типами пользователя.
- •5. Обобщенные методы. Объявление и детализация методов типами пользователя.
- •6. Ограничения на параметры в обобщенных классах и функциях.
- •7. Типы, допускающие значение null
- •8. Коллекции и итераторы. Оператор yield
- •9.Потоки ввода/вывода в c#. Создание объекта потока и работа с ним. Текстовые, бинарные потоки, потоки со сжатием данных.
- •11. Исключения. Создание класса пользовательского исключения. Генерация и перехват исключения.
- •12. Рефлексия типов. Класс типа Type. Методы и свойства класса.
- •13. Сборки. Статическое и динамическое связывание сборок. Класс сборки Assembly.
- •14. Позднее связывание. Класс System.Activator. Создание экземпляра объекта путем позднего связывания. Вызов методов объекта путем позднего связывания.
- •15. Атрибуты. Назначение атрибутов. Базовый класс атрибута. Аннотирование класса атрибутами.
- •16. Расширяющие методы.
- •17. Анонимные методы. Объявление и использование.
- •18. Захват переменных анонимными методами. Цепочка вызовов.
- •20. Захват переменных в лямбда-выражениях. Рекурсивный вызов в лямбда-выражениях. Анонимная рекурсия.
- •21. Выражения и деревья выражений. Стандартные делегаты, используемые с выражениями и деревьями выражений.
- •22. Комбинирование выражений посредством класса InvocatedExpression.
- •23. Язык интегрированных запросов linq. Назначение, технические средства для реализации языка. Группы языка linq.
- •24. Linq to Objects. Вид запроса. Вызов цепочек расширяющих методов. Языковые конструкции для кодирования запроса. Отложенное и неотложенное выполнение запроса.
- •25. Конструкция from…select… Разделы конструкции. Условия. Проекция. Анонимные типы данных.
- •26. Конструкция from…group… Разделы конструкции. Условия. Ключи группировки. Получение ключа в результате-выборке.
- •28. Linq to Objects. Расширяющие методы для преобразования типов, операций со множествами, преобразования в один элемент.
- •29. Технология linq to sql. Назначение технологии. Класс контекста данных и основные атрибуты для создания контекста данных.
- •30. Создание и подключение класса контекста данных к базе данных. Шаблон программирования при добавлении данных в объект контекста данных.
5. Обобщенные методы. Объявление и детализация методов типами пользователя.
C# поддерживает обобщенные методы. Любое объявление метода внутри структуры, класса или интерфейса может быть сделано обобщенным. Сюда входят и статические, и виртуальные или абстрактные методы. К тому же можно объявлять обобщенные методы в необобщенных типах. Чтобы объявить обобщенный метод, просто необходимо добавить аргумент типа в список аргументов в конце имени метода, но перед списком его параметров. Можно объявить любые типы в списке параметров метода, включая и тип возврата метода, как обобщенные параметры.
Синтаксис объявления обобщённого метода:
[модификатор доступа] [тип возвращаемого значения] <имя метода> <список параметров типа> (список аргументов)
Пример вызова:
public void MyMethod<T> (T myVar)
{ T second Var = myVar; }
int a = 0;
obj.MyMethod(a); obj.MyMethod<int>(a);
6. Ограничения на параметры в обобщенных классах и функциях.
Для того чтобы разрешить сложности объявления и использования обобщенных классов введены несколько синтаксических конструкций.
1) оператор default (<тип>) - он возвращает значения типа данных по умолчанию (для ссылочных типов – null, для типов значений - значения по умолчанию).
T myVar = default (T);
2) наложение ограничений на параметры обобщенного объекта (класса).
Ограничения накладываются с помощью ключевого слова where.
Public class MyGenericClass <T> where T: <ограничения>
Если нужно наложить ограничения на несколько параметров, то пишется where R<ограничения>
А если несколько ограничений на один параметр:
Where T : <ограничение>,<ограничение>
В качестве ограничений могут быть: 1. struct - значения типа или структура данных; 2. class - ссылочный тип. 3. Имя базового класса - параметр может быть базовым классом или производным от него. 4. Имя интерфейса - параметр может быть либо этим интерфейсом, либо наследуемым интерфейсом, либо любым классом, который реализует интерфейс. 5. New() - параметр должен быть классом, у которого есть пустой конструктор.
Нельзя делать циклических ограничений. При наследовании и применении ограничений в производных обобщенных классах нельзя снимать ограничения, наложенные в базовых обобщенных классах.
Любая сущность, которую можно объявить обобщенным образом, допускает применение ограничений. В объявлениях обобщенных методов и делегатов ограничение следует за списком формальных параметров метода или делегата. Например:
public delegate R Operation <T1, T2, R> (Tl vall, T2 val2)
where Tl: struct
where T2: struct
where R: struct;
public class EntryPoint
{
public static double Add( int vall, float val2 )
{ return vall + val2;}
public static void Main()
{
Operation<int, float, double> op =
new Operation<int, float, double>(EntryPoint.Add);
Console.WriteLine ("{0} + {1} = {2}", 1, 3.2, op(1, 3.2f));
}
}
7. Типы, допускающие значение null
Основная разница между типами значений и ссылочными типами состоит в том, что ссылочные типы могут иметь значение null (физически – 0). Существует много ситуаций, когда нужно, чтобы типы значений также имели значение null.
Nullable<int> a = null; // int ? a = null;
int b = 5; a = 2; int c = a+b;
Для типа bool? Существует таблица операций, значений и результатов. Существует операция ?? – бинарная операция: op1 ?? op2 – другая форма записи (op1 == null)?op2 : op1
Оператор ?? называется оператором, поддерживающим значение NULL, и используется для определения значения по умолчанию для нулевых типов значений, а также для ссылочных типов. Он возвращает левый операнд, если он не имеет значения NULL, в противном случае возвращает правый операнд.
Допускающий значение NULL тип может содержать значение или его значение может быть не определено. Оператор ?? определяет значение по умолчанию, которое будет возвращаться в том случае, если допускающему значение NULL типу будет присвоено любое другое значение. Если попытаться присвоить не допускающему значение NULL типу тип, допускающий значение NULL, без использования оператора ??, то будет сгенерирована ошибка времени компиляции. Если используется приведение типов и допускающий значение NULL тип в данный момент не определен, то будет выдано исключение InvalidOperationException. Явные преобразования. Допускающий значение NULL тип может быть приведен к обычному типу либо явным образом с помощью приведения, либо с помощью свойства Value. Пример: (int? n = null; int m2 = (int)n; int m3 = n.Value;). Если определенное пользователем преобразование определено между двумя типами данных, то это же преобразование может быть также использовано с допускающими значение NULL версиями этих типов данных. Неявные преобразования. Переменной допускающего значение NULL типа может быть присвоено значение NULL с помощью ключевого слова null: int? n1 = null; Преобразование из обычного типа в допускающий значение NULL является неявным (int? n2; n2 = 10;). Большинство обобщенных контейнеров находится в пространстве имен System.Collections.Generetic. При их использовании с типами значений можно получить существенно большую производительность, чем с общими списками (контейнерами). Это связано с тем, что при хранении типов значений в коллекции (обобщенной и обычной) применяются различные механизмы. При попытке разместить в обычном контейнере тип значения выполняется операция «упаковка объекта». Она заключается в создании объекта ссылочного типа, соответствующего типу значения, копирования значений в ссылочный объект и размещение объектов в контейнере. При обратной операции выполняется распаковка. В обобщенных контейнерах распаковки и упаковки не производятся.