Применение анонимных методов и лямбда-выражений вместе с событиями

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

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

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

using System;

// Объявить тип делегата для события,

delegate void MyEventHandler(int n);

// Объявить класс, содержащий событие,

class MyEvent {

  public event MyEventHandler SomeEvent;

  // Этот метод вызывается для запуска события,

  public void OnSomeEvent(int n) {

    if(SomeEvent != null)

      SomeEvent(n);

  }

}

class LambdaEventDemo {

  static void Main() {

    MyEvent evt = new MyEvent();

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

    evt.SomeEvent += (n) =>

       Console.WriteLine("Событие получено. Значение равно " + n);

    // Запустить событие,

    evt.OnSomeEvent(1);

    evt.OnSomeEvent(2);

  }

}

Вот к какому результату приводит выполнение этой программы.

Событие получено. Значение равно 1

Событие получено. Значение равно 2

Обратите особое внимание на то, как в этой программе лямбда-выражение используется в качестве обработчика событий.

evt.SomeEvent += (n) =>

      Console.WriteLine("Событие получено. Значение равно " + n);

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

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

// Использовать анонимный метод в качестве обработчика событий,

evt.SomeEvent += delegate(int n) {

  Console.WriteLine("Событие получено. Значение равно " + n);

};

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