![](/user_photo/2706_HbeT2.jpg)
- •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. Создание и подключение класса контекста данных к базе данных. Шаблон программирования при добавлении данных в объект контекста данных.
11. Исключения. Создание класса пользовательского исключения. Генерация и перехват исключения.
Исключение – объект специального вида. Все они наследуются от базового класса Exception. Пример исключений: ArgumentNullExeption (если ссылка на аргумент null, то выбрасывается исключение). Исключение создается с помощью оператора new. Оператор для генерации (выброса) исключений: throw <объект исключения>. Пример:
If(p == null)
{throw new ArgumentNullException(“Переменная р не может быть null”);}
В момент выбрасывания исключения возникает обратная раскрутка стека. Выполнение текущего метода прерывается. Раскрутка стека продолжается до тех пор, пока исключение либо не будет обработано, либо точка выполнения не сместится в специальный метод, который называется Глобальной Ловушкой Исключений. По умолчанию, на этот метод присоединена заглушка, т.е. специальный метод который почти ничего не делает, но можно присоединить и метод пользователя. Обработка исключения выполняется с помощью конструкции:
try {…//операции, которые могут выбросить исключение}
catch(<Класс исключения>[переменная])
{…//операции, которые выполняются при выбросе данного исключения}
К одной конструкции try можно прикрепить несколько блоков catch. Блоки catch проверяются на исключения по очереди. После catch переходим к следующему блоку после оператора. Обработка исключений: 1) заглушка исключения или вывод сообщения о нем; 2) возврат к точке исключения. Управлять кодом выполнения программы с помощью исключений неэффективно и бесперспективно, т.к. возрастают вычислительные потери на обработку исключений. В современном варианте выбрасывать исключения имеет смысл только тогда, когда программа точно не может продолжать выполнение в заданной ситуации. Еще один блок, который можно добавить к конструкции try-catch (или после всех catch, или после try, если catch нет) – finally. Он всегда находится в конце и его можно добавить только 1 раз. Операторы в блоке finally выполняются всегда. При написании нескольких блоков catch желательно останавливаться на исключении Exception(базовом классе исключений). Крайне нежелательно чтобы исключения появлялись в финализаторах класса. При возникновении исключения в статическом конструкторе CLR(среда выполнения) обрабатывает его специальным образом. Исходное исключение подавляется и вместо него генерируется исключение вида TypeInitializationException. При этом у нового вида TypeInitializationException свойство InnerException устанавливается в исходное исключение. Наиболее важные свойства класса Exception: 1) InnerException – вложенное исключение, имеет значение не null тогда, когда данное исключение сгенерировано на основе другого исключения. Это позволяет проследить цепочку исключений. 2) Message – текстовое сообщение об ошибке. 3) Source – исходный объект, который прогенерировал исключение.
12. Рефлексия типов. Класс типа Type. Методы и свойства класса.
Рефлексия - свойство объекта узнавать информацию о самом себе. В подавляющем большинстве языков программирования типы данных не в состоянии узнать информацию о самих себе во время выполнения. Рефлексия – это и есть механизм, который позволяет это делать. В С# с помощью рефлексии тип данных может узнать следующую информацию: 1) список общедоступных конструкторов; 2) список общедоступных методов, свойств, полей и их типы; 3)список общедоступных событий; 4) список интерфейсов, которые реализует класс; 5) список пользовательских атрибутов; 6) параметры подстановки в обобщенном классе и их ограничения.
Во время выполнения можно получить тип метода и вызвать его на объекте. Возможности рефлексии сосредоточены в двух пространствах имен: System.Reflection, System.Reflection.Emit.
Основной класс, отвечающий за возможности рефлексии, называется Type.
Объект этого же класса возвращается методом Object.GetType().У этого метода есть статический аналог, который вызывается не на методе, а на классе typeof(имя класса).
Например, если нужно узнать, что 2 объекта имеют одинаковый тип, то можно написать так: Object.ReferenceEquals(x.GetType(), y.GetType()) - этот метод вернет true, если у объектов совпадают типы.
Классу Type сопутствует набор вспомогательных классов, которые предназначены для хранения данных о конкретном члене класса (поле, методе, событии и др.). Все эти классы называются следующим образом: FieldInfo, PropertyInfo, MethodInfo, EventInfo, AttributeInfo, ConstructorInfo. С помощью объектов таких классов можно узнать информацию о члене класса.
Средства рефлексии позволяют также работать со сборками (с библиотеками). Класс для работы со сборками называется Assembly. Его методы позволяют узнать, какие элементы содержаться в сборке.
Пример: Имеется некоторый класс. В нем необходимо перекрыть метод ToString таким образом, чтобы он выводил список общедоступных свойств.
public class MyClass
{
public string FirstProperty {get;set}
public int SecondProperty {get;set}
}
PropertyInfo[]p = this.GetType().GetProperties(); //получаем массив свойств объекта
StringBuilder sb = new StringBuilder();
foreach (var pi in p)
{sb += pi.Name + ”=”; //возвращается имя свойства
sb += pi.GetValue(this , null).ToString();}
Метод GetValue возвращает значение object (в нашем случае, значение свойства).