Лямбда-Выражениe в C#

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

  • Экземпляр делегата.
  • Дерево выражения.

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

Следующие правила применимы к области действия переменной в лямбда-выражениях.

  • Захваченная переменная не будет уничтожена сборщиком мусора до тех пор, пока делегат, который на нее ссылается, не выйдет за границы области.
  • Переменная, введенная в лямбда-выражение, невидима во внешнем методе.
  • Лямбда-выражение не может непосредственно захватывать параметры 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();
        }
    }

 

Обновлено: 22.03.2018 — 19:38

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.