- •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. Создание и подключение класса контекста данных к базе данных. Шаблон программирования при добавлении данных в объект контекста данных.
15. Атрибуты. Назначение атрибутов. Базовый класс атрибута. Аннотирование класса атрибутами.
Это специальные классы, объекты которых можно присоединить к другим классам. Посредствам такой технологии можно связывать дополнительную информацию с классами или членами классов на этапе компиляции.
Основное назначение атрибутов – создание технологических подстроек, которые в последствие можно применить к пользовательским классам без изменения или расширения собственной функциональности класса.
Атрибуты указываются перед классами или элементом класса в [].
Базовым классом всех атрибутов является класс System.Attribute. Все стандартные или пользовательские атрибуты должны наследоваться от этого класса, и имя класса должно быть: <…> Attribute
При указании атрибута можно воспользоваться любым имеющимся у него конструктором, т.е. указать передаваемые в конструктор параметры.
Атрибуты часто используются для формирования дополнительной информации о сборке или приложении AssemblyInfo.cs
Имеется огромное количество встроенных атрибутов, которые отвечают за определенные технологии.
Наиболее популярные:
1) System.Diagnostics.ConditionalAttribute;
2) System.ObsoleteAttribute;
3) System.SerializableAttribute;
4) System.Reflection.AssemblyDelaySignAttribute;
5) XML [Node, Attribute, Iquore] Attribute.
Привязка объектов атрибутов к классам происходит неявным образом, в момент загрузки сборки.
16. Расширяющие методы.
Достаточно часто пользователю предлагается герметизированные классы. Эти классы обладают достаточно большой функциональностью. Но пользователю нужны другие методы, которые составляются на основе базовой общедоступной функциональности. Если наследование произвести нельзя, то и эти методы добавить в классы тоже нельзя. Технически обойти такую сложность можно с помощью статических методов с передачей объекта в качестве параметра. Но синтаксически это не выглядит как программирование в ООП стиле.
Расширяющий метод – это просто особый синтаксис статического метода.
Пример расширяющего метода (может находится только в статическом классе):
public static class ExtensionMethods
{
static StreamWriter writer = new StreamWriter(“log.txt”, true);
public static void SendToLog(this string str)
{writer.WriteLine(str);}
}
string myStr = “Моя строка”;
myStr.SendToLog();
Первый параметр в сигнатуре расширяющего метода указывается с ключевым словом this. Вызов в дальнейшем расширяющего метода осуществляется на объекте совместного типа, так как-будто это метод класса. Остальные параметры записываются как обычные параметры метода. Их и только их надо будет указать при вызове расширяющего метода.
17. Анонимные методы. Объявление и использование.
Во множестве методов для передачи способа действий в качестве параметра передаётся делегат. Если таких действий оказывается очень много, то приходится размещать в классах огромное количество небольших методов. Все эти методы, как правило, непосредственного отношения к классу не имеют.
Чтобы избавиться от необходимости определения таких методов, как собственных методов класса, введены анонимные методы. Эти методы не имеют названий и определяются в том месте, где они, собственно, и нужны. Пример:
public static class Program
{
public static void Main()
{
Processor p = new Processor();
p.Strategy = delegate(int x) {return x * 2;}
int[] source = new int[10];
int[] y = p.Process(source);
p.Strategy = delegate(int x) {return x + 2;}
y = p.Process(source);
}
}
Определение анонимного метода аналогично определению обычного метода. Иногда можно даже не указывать передаваемые параметры при определении анонимного метода. При этом совместимость типа анонимного метода и делегата остаётся (p.Strategy = delegate {return 0;}).
При присваивании анонимного метода экземпляру делегата следует соблюдать несколько правил. Во-первых, типы параметров делегата должны быть совместимыми с типами параметров анонимного метода. Иногда, если анонимный метод не имеет списка параметров (т.к. они не используются в методе), то он является преобразуемым к типу делегата со списком параметров до тех пор, пока этот список не включает никаких параметров out и ref. Если параметры out присутствуют, то анонимный метод обязан перечислить их в списке параметров в точке объявления.
Во-вторых, если анонимный метод перечисляет какие-то параметры в своем объявлении, их количество должно совпадать с параметрами типа делегата, и каждый из их типов должен быть неявно преобразуемым к этим типам в объявлении делегата. И, наконец, тип возврата анонимного метода должен быть неявно преобразуемым к объявленному типу возврата делегата. Поскольку синтаксис объявления анонимного метода явно не устанавливает типа возврата, компилятор должен проверить каждый оператор return и убедиться, что он возвращает тип, отвечающий правилам преобразования.