- •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. Создание и подключение класса контекста данных к базе данных. Шаблон программирования при добавлении данных в объект контекста данных.
21. Выражения и деревья выражений. Стандартные делегаты, используемые с выражениями и деревьями выражений.
Обычно лямбда–выражения (λ–выражения) конвертируются в делегаты.
Func <int, int> func1= x => x+1;
func1 (10) -> 11
В этой строке кода выражение преобразуется в делегат, принимающий единственный целочисленный параметр и возвращающий int.
Expression < Func< int, int >>func1 = n = > n+1;
В этой модификации λ–выражения, вместо того, чтобы конвертироваться в вызываемый делегат, преобразуется в структуру данных, представляющую операцию.
Expression - класс для дерева выражений.
Параметр n имеет тип <Func <int, int>> делегата.
Из этого делегата, согласно λ–выражению строится новый делегат по следующему принципу: берется старый делегат, вычисляется значение для некоторого конкретного параметра и к результату добавляется единица.
Деревья выражений представляют код в виде древовидной структуры данных, каждый узел в которой является выражением.
Таким образом, Expression представляет собой структуру, которая хранит внутри себя делегат. Этот делегат можно получить с помощью метода Compile().
Func <int, int> funcz = expr.Compile();
funcz(5);
Деревья-выражения позволяют компилировать делегаты по средствам синтаксиса λ–выражений или операторов.
Пространство имен, отвечающее за деревья-выражения имеет следующие классы: 1) Expression - Предоставляет базовый класс, производными от которого являются классы, представляющие узлы дерева выражения. Также содержит заводские методы static (Shared в Visual Basic) для создания различных типов узлов. Это класс abstract. 2) Parametrer Expression - объекты класса содержат параметры для последовательной подстановки. 3) Binary Expression - Представляет выражение, содержащее бинарный оператор. 4) Unary Expression - Представляет выражение, содержащее унарный оператор. 5) Constant Expression - Представляет выражение, содержащее постоянное значение. 6) Expression <TDelegate> - представляет собой строго типизированное дерево выражений. Этот класс не может быть унаследован. 7) Invocation Expression -позволяет применять λ–выражения к списку деревьев выражений. Играет решающую роль, когда нужно скомпилировать несколько выражений. 8) LambdaExpression - Описывает лямбда-выражение. Оно захватывает блок кода, сходный с телом метода .NET
Пример:
Использование Invocation Expression для производства новых деревьев-выражений.
Рассмотрим на функции одной переменной:
public delegate T.Func2D<T>(T arg);
public static class Functions{
public static Expression <Func2D<T>> Constant <T> (T value)
{
Parameter Expression argument = Expression .Parametr (typeof(T), “x”);
return Expression<Func2D<T>>.Lambda<Func2D<T>>((Expression.Constant (value),argument));
}
}
Метод (Expression.Constant (value), argument) создает объект с const подстановкой. Cтатическая общ. функция - возвращает дерево-выражений, в которых есть const. argument - набор параметров для подстановки.
Стандартные делегаты, используемые с выражениями и деревьями выражений - Func и Action.
Они обеспечивают гибкость делегатов с общими параметрами, которые могут быть использованы для различных целей, в том числе успешно лямбда-выражений к параметрам метода. Делегат Func предназначен для инкапсуляции метода, который принимает в качестве параметров от нуля дл четырех аргументов и возвращает значение. Что же касается делегата Action, то единственное отличие его от Func – это то, что Action возвращает процедуру.
Использование Func. Инкапсулирует метод без параметров и возвращает значение типа, указанного в параметре TResult. public delegate TResult Func<TResult>(). Есть и другие сигнатуры этого метода. Использование Action. Делегат Action имеет пять перегрузок по сигнатурам, которые позволяют использовать до четырех параметров, но при этом Action не возвращает никаких значений. А самое интересное, что параметром для Action может быть любой тип для любого из параметров в сигнатуре. public delegate void Action().