День сто тридцать шестой. #ЗаметкиНаПолях

Лямбда-выражения. Начало

Лямбда-выражение - это блок кода (выражение или блок операторов), который обрабатывается как объект. Он может быть передан в качестве аргумента методам, а также может быть возвращен методом.

Варианты использования:

- Код для исполнения асинхронным методом, таким как Task.Run(Action).

- Выражения для запросов LINQ.

- Создание деревьев выражений.



Лямбда-выражения - это код, который может быть представлен как делегат или как дерево выражений, которое компилируется в делегат. Конкретный тип делегата лямбда-выражения зависит от его параметров и возвращаемого значения. Лямбда-выражения, которые не возвращают значение, соответствуют конкретному делегату Action с соответствующим количеством параметров. Лямбда-выражения, которые возвращают значение, соответствуют конкретному делегату Func с соответствующим количеством параметров. Например, лямбда-выражение, которое имеет два параметра, но не возвращает значения, соответствует делегату Action<T1, T2>. Лямбда-выражение с одним параметром, возвращающее значение, соответствует делегату Func<T, TResult>.

Лямбда-выражение использует =>, оператор лямбда-объявления, чтобы отделить список параметров лямбды от его исполняемого кода. Чтобы создать лямбда-выражение, указываются входные параметры (если они есть) слева от оператора лямбда-выражения, и само выражение с другой стороны. Например, однострочное лямбда-выражение x => x * x указывает параметр с именем x и возвращает значение x в квадрате.

Это выражение можно назначить:

- типу делегата:

Func<int, int> square = x => x * x;

Console.WriteLine(square(5));

// вывод: 25

- дереву выражений:

using System.Linq.Expressions;

Expression<Func<int, int>> exp = x => x * x;

Console.WriteLine(exp);

// вывод: x => (x * x)

- аргументу метода:

int[] numbers = { 2, 3, 4, 5 };

var squaredNumbers = numbers.Select(x => x * x);

Console.WriteLine(string.Join(" ", squaredNumbers));

// вывод: 4 9 16 25



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



Все ограничения, которые применяются к анонимным методам (см. https://t.me/NetDeveloperDiary/163), также применяются к лямбда-выражениям.



Продолжение следует…



Источник: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/lambda-expressions