В C# как анонимные функции, так и лямбда-выражения являются мощными функциями, позволяющими писать лаконичный и выразительный код. Хотя они служат схожим целям, между ними есть некоторые ключевые различия. В этой статье мы рассмотрим эти различия и приведем примеры кода, демонстрирующие их использование.
- Анонимные функции:
Анонимная функция — это функция без имени. Обычно он определяется с помощью ключевого словаdelegateили делегатовActionиFunc. Вот пример:
delegate void PrintDelegate(string message);
static void Main()
{
PrintDelegate print = delegate (string message)
{
Console.WriteLine(message);
};
print("Hello, anonymous function!");
}
- Лямбда-выражения.
Лямбда-выражения — это сокращенная запись для написания анонимных функций. Они предоставляют краткий синтаксис и обычно используются с функциональными интерфейсами или операциями LINQ. Вот пример:
Action<string> print = (message) =>
{
Console.WriteLine(message);
};
print("Hello, lambda expression!");
- Лямбда-выражения с одним оператором.
Лямбда-выражения можно еще больше упростить, если они состоят из одного оператора. В таких случаях вы можете опустить фигурные скобки и ключевое слово return. Вот пример:
Action<string> print = message => Console.WriteLine(message);
print("Hello, single-statement lambda!");
- Вывод типа.
Лямбда-выражения поддерживают вывод типа. Это означает, что вам не нужно явно указывать типы параметров. Компилятор может определить типы на основе контекста. Вот пример:
Func<int, int, int> add = (a, b) => a + b;
int result = add(2, 3); // result = 5
- Захват переменных.
Лямбда-выражения могут захватывать переменные из их внешней области видимости. Это позволяет им получать доступ к переменным и манипулировать ими даже после того, как они вышли за пределы области видимости. Вот пример:
int multiplier = 2;
Func<int, int> multiply = x => x * multiplier;
int result = multiply(5); // result = 10
Подводя итог, можно сказать, что анонимные функции и лямбда-выражения — это мощные инструменты C# для написания лаконичного и выразительного кода. Понимание различий между ними поможет вам выбрать подходящий подход для разных сценариев, будь то работа с делегатами, функциональными интерфейсами или операциями LINQ.