Лямбда-выражения-это не именованный метод, записанный вместо экземпляра делегата. Компилятор немедленно преобразовывает лямбда-выражения в одну из следующих двух конструкций.
- Экземпляр делегата.
- Дерево выражения.
Лямбда-выражение — своего рода анонимная функция, которая содержит выражения и операторы и может использоваться для создания делегатов. Внутренне компилятор преобразует лямбда-выражение этого типа в анонимный метод, телом которого будет код выражения.
Следующие правила применимы к области действия переменной в лямбда-выражениях.
- Захваченная переменная не будет уничтожена сборщиком мусора до тех пор, пока делегат, который на нее ссылается, не выйдет за границы области.
- Переменная, введенная в лямбда-выражение, невидима во внешнем методе.
- Лямбда-выражение не может непосредственно захватывать параметры ref или out из включающего их метода.
- Лямбда-выражение не может содержать оператор goto, оператор break или оператор continue, для которых, метка перехода находится вне тела либо в теле содержащейся
анонимной функции. - Во всех лямбда-выражениях используется лямбда-оператор =>, который читается как «переходит в». Левая часть лямбда-оператора определяет параметры ввода (если таковые
имеются), а правая часть содержит выражение или блок оператора. Лямбда-выражение x => x * x читается как «x переходит в x, x раз».
Если лямбда-выражение имеет только один параметр ввода, скобки можно не ставить (что и было в нашем примере), во всех остальных случаях скобки обязательны. Два и более параметра разделяются запятыми и заключаются в скобки.
Например:
(x, y) => x == y
Иногда компилятору бывает трудно или даже невозможно определить введенные типы. В этом случае типы можно указать в явном виде, как показано в следующем примере:
(int x, string s) => s.Length > x
Нулевые параметры ввода (т. е. когда параметры вообще отсутствуют) указываются пустыми скобками:
() => SomeMethod()
Следующий пример демонстрирует как с помощью делегата и лямбда-выражения можно написать калькулятор:
class Program
{
delegate int MyDelegat (int i, int n);
static void Main(string[] args)
{
MyDelegat a = (x,y)=>x+y;
MyDelegat s = (x,y)=>x-y;
MyDelegat m = (x, y) => x * y;
MyDelegat d = (x, y) => x / y;
int add = a(12,23);
int sub = s(15,10);
int mul = m(2,3);
int del = d(4,2);
Console.WriteLine("Сложение {0} Вычитание {1} Умножение {2} Деление {3}", add,sub,mul,del);
Console.ReadKey();
}
}
Рассмотрим еще два примера которые дают наглядно представление о лямбда-выражении, лямбда-операторе и лямбда-методе.
public delegate int MyDelegate(int a);
class Program
{
static void Main()
{
MyDelegate myDelegate;
myDelegate = delegate(int x) { return x * 2; }; // Лямбда-Метод
myDelegate = (x) => { return x * 2; }; // Лямбда-Оператор.
myDelegate = x => x * 2; // Лямбда-Выражение.
int result = myDelegate(4);
Console.WriteLine(result);
// Delay.
Console.ReadKey();
}
}
public delegate void MyDelegate();
class Program
{
static void Main()
{
MyDelegate myDelegate;
myDelegate = delegate { Console.WriteLine("Hello 1"); }; // Лямбда-Метод
myDelegate += () => { Console.WriteLine("Hello 2"); }; // Лямбда-Оператор.
myDelegate += () => Console.WriteLine("Hello 3"); // Лямбда-Выражение.
myDelegate();
// Delay.
Console.ReadKey();
}
}
