Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Vse_shpory_po_OOP_polnye.doc
Скачиваний:
6
Добавлен:
20.09.2019
Размер:
295.94 Кб
Скачать

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().

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]