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

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

Основные характеристики

  1. Анонимность — не имеет имени (в отличие от обычных методов).
  2. Гибкость — может быть присвоено делегату или выражению (Expression<T>).
  3. Замыкания — имеет доступ к переменным из внешней области видимости.

Синтаксис

(входные_параметры) => тело_выражения

Примеры лямбда-выражений

1. Простое выражение

Func<int, int> square = x => x * x;
Console.WriteLine(square(5)); // Выведет 25

2. Многострочное выражение

Action<string> greet = name =>
{
    string greeting = $"Привет, {name}!";
    Console.WriteLine(greeting);
};
greet("Анна"); // Выведет "Привет, Анна!"

3. Использование в LINQ

var numbers = new List<int> { 1, 2, 3, 4 };
var evenNumbers = numbers.Where(n => n % 2 == 0); // Фильтрация чётных чисел

Захват переменных

Лямбды могут "запоминать" переменные из внешнего контекста:

int multiplier = 3;
Func<int, int> multiply = x => x * multiplier;
Console.WriteLine(multiply(4)); // Выведет 12

Разница между лямбдой и делегатом

  • Делегат — тип, указывающий на метод с определённой сигнатурой.
  • Лямбда — реализация этого метода "на лету".

Пример с делегатом

delegate int Operation(int a, int b);
Operation add = (a, b) => a + b; // Лямбда присвоена делегату

Преимущества и недостатки

Плюсы:

  • Уменьшает объем шаблонного кода.
  • Улучшает читаемость (особенно в LINQ).
  • Позволяет писать функциональный стиль в C#.

Минусы:

  • Может усложнить отладку (из-за отсутствия имени).
  • Неуместное использование замыканий может привести к утечкам памяти.

Где применяется?

  1. LINQ-запросы (Where, Select, OrderBy).
  2. Асинхронные операции (Task.Run(() => { ... })).
  3. Обработчики событий (button.Click += (s, e) => MessageBox.Show("Clicked!")).

Резюмируем:

лямбда-выражения — это мощный инструмент для написания лаконичного и выразительного кода, особенно полезный при работе с делегатами, LINQ и асинхронными операциями.