← Назад к вопросам

Что такое лямбда-выражение?

2.3 Middle🔥 211 комментариев
#Основы C# и .NET

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Лямбда-выражения в C#

Лямбда-выражение — это компактный синтаксис для создания анонимных функций (методов без имени) в C#, который позволяет описывать операцию непосредственно в месте её использования. Это ключевая часть функциональных возможностей языка, интегрированная с делегатами и LINQ.

Синтаксис и виды лямбда-выражений

Синтаксис лямбды имеет две основные формы:

// 1. Лямбда-оператор (выражение с телом)
(input-parameters) => { <sequence-of-statements> }

// 2. Лямбда-выражение (одно выражение)
(input-parameters) => <expression>

Примеры:

// Пример для делегата Func<int, int>
Func<int, int> square = x => x * x; // Лямбда-выражение (одна операция)
Console.WriteLine(square(5)); // Вывод: 25

// Пример для делегата Action<string>
Action<string> greet = name => 
{ 
    // Лямбда-оператор с телом (несколько операций)
    string message = $"Hello, {name}!";
    Console.WriteLine(message);
};
greet("Alice");

Связь с делегатами и типами

Лямбда-выражения не существуют сами по себе — они всегда преобразуются компилятором в одну из двух сущностей:

  • Делегат (если тип лямбды явно указан как делегат, например, Func или Action).
  • Экземпляр типа Expression<TDelegate> из пространства имен System.Linq.Expressions, представляющий дерево выражений для анализа или трансформации (например, в запросах LINQ to Entities).
// Компилятор преобразует лямбду в делегат
Func<int, bool> isEvenDelegate = num => num % 2 == 0;

// Компилятор преобразует лямбду в дерево выражений
Expression<Func<int, bool>> isEvenExpression = num => num % 2 == 0;

Ключевые особенности и преимущества

  • Анонимность: Не требуют объявления отдельного метода, что уменьшает объем кода.
  • Контекстная привязка: Могут захватывать переменные из окружающего контекста (замыкания).
int multiplier = 3;
Func<int, int> multiply = x => x * multiplier; // Захват переменной multiplier
Console.WriteLine(multiply(4)); // Вывод: 12
  • Использование в LINQ: Основа для написания запросов в функциональном стиле.
var numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0); // Лямбда в качестве предиката
  • Сокращенный синтаксис для параметров: Если тип параметров может быть выведен компилятором, его можно не указывать.

Практическое применение в Backend разработке

В контексте backend разработки на C# лямбда-выражения используются повсеместно:

  1. Фильтрация, сортировка и проекция данных в LINQ (как в LINQ to Objects, так и в ORM, таких как Entity Framework Core).
  2. Асинхронные операции: Создание продолжений для задач (Task).
await SomeAsyncMethod().ContinueWith(task => 
{
    if (task.IsCompletedSuccessfully)
        Console.WriteLine("Operation completed.");
});
  1. Обработка событий и callbacks: Упрощенное присваивание обработчиков событий.
  2. Функциональная трансформация данных: В рамках методов высшего порядка, таких как Select, Aggregate, GroupBy.
  3. Настройка middleware и политик: Например, в ASP.NET Core при конфигурации.
app.Use(async (context, next) => 
{
    // Лямбда для middleware
    await context.Response.WriteAsync("Custom logic before next...");
    await next();
});

Вывод

Лямбда-выражения — это мощный и элегантный инструмент C#, который радикально сокращает boilerplate код, повышает выразительность и плотность программ, особенно в сочетании с делегатами, LINQ и асинхронными паттернами. Для backend разработчика глубокое понимание лямбд критически важно для эффективной работы с данными, построения гибкой архитектуры и использования современных фреймворков, таких как ASP.NET Core. Они представляют собой синтаксическую "сладкую оболочку" над концепцией анонимных методов, делающую функциональный стиль программирования в C# естественным и доступным.

Что такое лямбда-выражение? | PrepBro