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

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, представляющее вызов метода. ВыраженияParameterExpression, MethodCallExpression и другие зависящие от выражения типы также определяются в пространстве имен 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();

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