Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
My_shpory_Ivan_Ivanich (2).docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
149.35 Кб
Скачать

22. Лямбда-выражения, замыкание лямбда-выражений

Лямбда-выражение — это анонимная функция, с помощью которой можно создавать типы делегатов или деревьев выражений. С помощью лямбда-выражений можно написать локальные функции, которые затем можно передавать в другие функции в качестве аргументов или возвращать из них в качестве значения. Лямбда-выражения особенно полезны при написании выражений запросов LINQ. Для создания лямбда-выражения можно определить входные параметры (если таковые имеются) слева лямбда-оператора => и поместить блок выражений или выписки на другую сторону. Например, лямбда-выражение x => x * x принимает параметр с именем x и возвращает значение x, возведённое в квадрат.  Лямбда-операторы используются в запросах LINQ с синтаксисом на основе методов в качестве аргументов методов стандартных операторов запроса, таких как Where.

При использовании синтаксиса на основе методов для вызова метода Where класса Enumerable (как это происходит в LINQ to Objects и LINQ to XML) параметром является тип делегата System.Func<T, TResult>. Лямбда-выражение — это наиболее удобный способ создания такого делегата. При вызове того же метода, к примеру, в классе System.Linq.Queryable (как это делается в LINQ to SQL) типом параметра будет System.Linq.Expressions.Expression<Func>, где Func — это любые делегаты Func с числом входных параметров не более шестнадцати. Опять же, лямбда-выражения представляют собой самый быстрый способ построения такого дерева выражений. Лямбда-выражения позволяют вызовам Where выглядеть одинаково, хотя, на самом деле, объекты, созданные из лямбда-выражений, будут иметь разные типы.

Лямбда-выражение с выражением с правой стороны оператора => называется выражением-лямбдой. Выражения-лямбды широко используются при создании таких конструкций как Деревья выражений (C# и Visual Basic).Выражения-лямбды возвращают результат выражения и имеют следующую основную форму:

(input parameters) => expression

Если лямбда имеет только один входной параметр, скобки можно не ставить, во всех остальных случаях они обязательны. Если входных параметров два и более, то они разделяются запятыми и заключаются в скобки:

(x, y) => x == y

Иногда компилятору бывает трудно или даже невозможно вывести типы входных параметров. В этом случае типы можно указать в явном виде, как показано в следующем примере:

(int x, string s) => s.Length > x

Отсутствие входных параметров задаётся пустыми скобками.

() => SomeMethod()

Обратите внимание на предыдущий пример: тело выражения-лямбды может состоять из вызова метода. Однако при создании деревьев выражений, которые вычисляются вне .NET Framework, например в SQL Server, не следует использовать вызовы методов в лямбда-выражениях. Эти методы не имеют смысла вне контекста среды CLR .NET.

23. Деревья выражений, типы деревьев. Создание деревьев выражений

Деревья выражений представляют код в виде древовидной структуры данных, каждый узел в которой является выражением, например вызовом метода или двоичной операцией, такой как x < y.

Можно компилировать и выполнять код, представленный деревьями выражений. Это обеспечивает возможность динамической модификации выполняемого кода, выполнения запросов LINQ в различных базах данных и создания динамических запросов. 

Кроме того, деревья выражений используются в среде выполнения динамического языка (DLR) для обеспечения взаимодействия между динамическими языками и платформой .NET Framework и предоставления создателям компиляторов возможности выдавать деревья выражений вместо языка MSIL. Дополнительные сведения о среде DLR см. в разделе Общие сведения о среде DLR.

Можно создать дерево выражений на основе анонимного лямбда-выражения с использованием компилятора C# или Visual Basic или создать деревья выражений вручную с использованием пространства имен System.Linq.Expressions.

Когда лямбда-выражение назначается переменной с типом Expression<TDelegate>, компилятор выдает код для создания дерева выражений, представляющего лямбда-выражение.

Создать деревья выражений с использованием API-интерфейса можно с помощью класса Expression. Этот класс содержит статические методы фабрики, которые создают узлы дерева выражений особых типов, например выражение ParameterExpression, представляющее переменную или параметр, или выражение MethodCallExpression, представляющее вызов метода. ВыраженияParameterExpressionMethodCallExpression и другие зависящие от выражения типы также определяются в пространстве имен System.Linq.Expressions. Эти типы являются производными от абстрактного типа Expression.

В следующем примере кода демонстрируется способ создания дерева выражений, которое представляет лямбда-выражение num => num < 5

ParameterExpression numParam = Expression.Parameter(typeof(int), "num");

ConstantExpression five = Expression.Constant(5, typeof(int));

BinaryExpression numLessThanFive = Expression.LessThan(numParam, five); знак “<”

Expression<Func<int, bool>> lambda = Expression.Lambda<Func<int, bool>>(numLessThanFive, new[] { numParam });

Выполнение деревьев выражений

Func<bool> compiledExpression = lambda.Compile();

bool result = compiledExpression();

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