C# Лямбда-выражения: делегаты и анонимные методы

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

Делегаты и ссылки на методы

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

Пример: можно создать делегат Action<MyClass> (где MyClass — некоторый класс), который ссылается на метод этого класса. Это позволяет вызывать методы объекта через делегат.

Можно создавать цепочки вызовов методов, передавая делегаты между объектами.

Лямбда-выражения: удобство и лаконичность

Лямбда-выражения позволяют генерировать метод прямо в месте его использования, избегая создания отдельных методов. Это особенно удобно, когда метод используется только один раз.

Пример: Action ничего не возвращает и не принимает параметров. Action<T> принимает один параметр типа T. Func<T> возвращает значение типа T.

//Пример использования Action
Action a = () => Console.WriteLine("Hello from lambda!");
a(); // Выведет "Hello from lambda!" в консоль

Здесь анонимный метод помещён в переменную типа делегата и вызван.

Использование лямбда-выражений в обработке событий

Лямбда-выражения удобны при подписке на события. Например, при обработке события клика кнопки:

button.Click += (sender, e) => Console.WriteLine("Кнопка нажата!");

Здесь на событие Click кнопки подписан анонимный метод.

Лямбда-выражения в качестве аргументов методов

Лямбда-выражения удобно использовать в качестве аргументов методов, особенно для передачи небольших фрагментов кода. Например, в алгоритме сортировки можно передать лямбда-выражение в качестве функции сравнения:

//Пример использования лямбда-выражения в качестве функции сравнения
Array.Sort(numbers, (a, b) => a.CompareTo(b));

Здесь лямбда-выражение (a, b) => a.CompareTo(b) сравнивает два числа.

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

Синтаксис: (параметры) => { тело }

Для однострочных лямбда-выражений фигурные скобки можно опустить. Результатом выполнения строки станет результат всего лямбда-выражения.

//Однострочное лямбда-выражение
(a, b) => a > b;

//Многострочное лямбда-выражение
(a, b) =>
{
  //несколько строк кода
  return a > b;
};

Лямбда-выражения могут принимать параметры или не принимать вовсе (() => { … }).

Когда использовать лямбда-выражения

Лямбда-выражения идеально подходят для коротких, одноразовых функций, не требующих отдельного объявления. Они делают код более компактным и читаемым.

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

Что будем искать? Например,программа