Лямбда-выражения-это не именованный метод, записанный вместо экземпляра делегата. Компилятор немедленно преобразовывает лямбда-выражения в одну из следующих двух конструкций.
- Экземпляр делегата.
- Дерево выражения.
Лямбда-выражение — своего рода анонимная функция, которая содержит выражения и операторы и может использоваться для создания делегатов. Внутренне компилятор преобразует лямбда-выражение этого типа в анонимный метод, телом которого будет код выражения.
Следующие правила применимы к области действия переменной в лямбда-выражениях.
- Захваченная переменная не будет уничтожена сборщиком мусора до тех пор, пока делегат, который на нее ссылается, не выйдет за границы области.
- Переменная, введенная в лямбда-выражение, невидима во внешнем методе.
- Лямбда-выражение не может непосредственно захватывать параметры ref или out из включающего их метода.
- Лямбда-выражение не может содержать оператор goto, оператор break или оператор continue, для которых, метка перехода находится вне тела либо в теле содержащейся
анонимной функции. - Во всех лямбда-выражениях используется лямбда-оператор =>, который читается как «переходит в». Левая часть лямбда-оператора определяет параметры ввода (если таковые
имеются), а правая часть содержит выражение или блок оператора. Лямбда-выражение x => x * x читается как «x переходит в x, x раз».
Если лямбда-выражение имеет только один параметр ввода, скобки можно не ставить (что и было в нашем примере), во всех остальных случаях скобки обязательны. Два и более параметра разделяются запятыми и заключаются в скобки.
Например:
1 |
(x, y) => x == y |
Иногда компилятору бывает трудно или даже невозможно определить введенные типы. В этом случае типы можно указать в явном виде, как показано в следующем примере:
1 |
(int x, string s) => s.Length > x |
Нулевые параметры ввода (т. е. когда параметры вообще отсутствуют) указываются пустыми скобками:
1 |
() => SomeMethod() |
Следующий пример демонстрирует как с помощью делегата и лямбда-выражения можно написать калькулятор:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
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(); } } |
Рассмотрим еще два примера которые дают наглядно представление о лямбда-выражении, лямбда-операторе и лямбда-методе.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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(); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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(); } } |