- •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. Создание и подключение класса контекста данных к базе данных. Шаблон программирования при добавлении данных в объект контекста данных.
3. События. Объявление события. Шаблон проектирования события в классе. Свойство для безопасной работы с событиями. Безопасный вызов события в многопоточном программировании.
События генерируются, т.е. выдаются объектами, и для них можно предоставлять реагирующий на них выполнением какого-нибудь действия код. На события нужно подписываться. Под подпиской на событие подразумевается предоставление кода, который должен выполняться при генерации данного события, в виде обработчика событий. На событие можно подписывать несколько обработчиков, которые тогда все будут вызываться при генерации данного события. Эти обработчики могут являться как частью того класса объекта, который генерирует данное событие, так и частью других классов. Сами обработчики событий представляют собой просто функции. Единственным ограничением для такой функции является то, что ее возвращаемый тип и параметры должны обязательно соответствовать тем, которых требует событие. Это ограничение входит в состав определения события и задается делегатом. Базовая последовательность обработки выглядит следующим образом: сначала приложение создает объект, который может генерировать событие. Далее приложение подписывается на событие. Приложение может это делать путем определения функции, пригодной для использования с указанным в событии типом делегата, и передачи ссылки на эту функцию событию. Эта функция-обработчик событий может представлять собой метод в другом объекте. И, наконец, последнее: при генерации события подписчику отправляется соответствующее уведомление.
// Определение события
public event EventHandler<PlayEventArgs> PlayEvent;
События накладывают определенные правила на использование делегатов. Делегат должен что-нибудь возвращать и должен принимать два аргумента. Первый аргумент – ссылка на объект, представляющий сторону, которая генерирует сообщение. Второй аргумент — тип, унаследованный от System.EventArgs. В С# перегружены операции + и -= для событий, чтобы предоставить компактную нотацию для регистрации и отмены регистрации событий. Компилятор генерирует два метода— addOnPlay и removeOnPlay, которые вызываются, когда вы используете перегруженные операции += и -=. Эти методы управляют добавлением и удалением делегатов в цепочке делегатов событий. Фактически компилятор С# не позволяет вам вызывать эти методы явно, так что мы обязаны использовать перегруженные операции. Но есть способ контролировать тело этих двух функций. В С# необходимо проверить событие на равенство null, прежде чем вызывать его, иначе будет сгенерировано исключение NullReferenceException. Метод OnPlay создает локальную копию события перед проверкой на null. Это позволяет избежать состояния "гонок".
4. Обобщенные классы. Объявление и детализация класса типами пользователя.
Обобщения позволяют создавать открытые типы, которые преобразуются в закрытые во время выполнения. Каждый закрытый тип уникален и могут существовать объекты только закрытых типов.
List<int> list = new List<int>();
List<T> - объявление обобщенного класса (т.е. класс зависит от параметра);
Т - это указатель (место заполнения, куда подставляется любой тип - только после подставления конкретного типа получаем закрытый тип).
List<int> - процесс преобразования открытого типа в закрытый во время выполнения.
Закрытый тип используется как любой другой объявленный тип и следует тем же самыми правилам. Отличие состоит лишь в том, что он создан на основе обобщённого типа. Обобщения - удобный способ описания классов общего назначения с одинаковой логической функциональностью, но с жесткой типизацией параметров.
Механизм компиляции: В 2 этапа: 1) Компилятор из С#-кода (текста программы) генерирует промежуточный IL-код; этот код и будет находиться в скомпилированной программе. 2) происходит в момент загрузки программы и попытки выполнения участков кода (методов). Эту компиляцию осуществляет CLR и называется она JIT-компиляцией. Для каждого метода проводится только 1 раз. При ее выполнении самостоятельно выбирается оптимальный способ преобразования IL-конструкций в машинные инструкции. Обобщенные классы допускают перегрузку. Она выполняется только по числу параметров в обобщённом классе. На обобщённых классах допускается наследование.
Определение обобщенных классов. Для создания обобщенного класса достаточно применить в определении класса синтаксис в виде угловых скобок:
class MyGenericClass<T>
{ }
Здесь на месте Т можно указывать какой угодно идентификатор, главное соблюдать стандартные правила именования языка С#, т.е. не начинать имя с числа и т.п.
Обычно, однако, достаточно использовать и просто Т. Обобщенный класс может содержать в своем определении любое количество типов, отделенных друг от друга запятой:
class MyGenericClass<Tl, Т2, Т3>
{ }
После определения эти типы можно применять в определении класса точно так же, как и любые другие типы. Например, их можно использовать и в качестве типов для переменных членов, и в качестве возвращаемых типов для членов, вроде свойств или методов, и в качестве типов параметров для аргументов методов. Другое ограничение, о котором тоже нужно знать, состоит в том, что при сравнении значения типа, указанного в обобщенном классе, со значением null, разрешено использовать только операцию == или !=.