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

Групповая адресации события

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

namespace ConsoleApplication1{ delegate void MyEventHandler(); // Объявить делегат, содержащий событие, class MyEvent { public event MyEventHandler SomeEvent; // Этот метод вызывается для запуска события, public void OnSomeEvent() { if (SomeEvent != null) SomeEvent(); } } class X { public void Xhandler() { Console.WriteLine("Событие получено объектом класса X"); } } class Y { public void Yhandler() { Console.WriteLine("Событие получено объектом класса Y"); } } class Program { static void Handler() { Console.WriteLine("Событие получено объектом класса Program"); } static void Main(string[] args) { MyEvent evt = new MyEvent (); X xOb = new X () ; Y yOb = new Y(); // Добавить обработчики в список событий. evt.SomeEvent += Handler; evt.SomeEvent += xOb.Xhandler; evt.SomeEvent += yOb.Yhandler; // Запустить событие, evt.OnSomeEvent(); Console.WriteLine (); // Удалить обработчик, evt.SomeEvent -= xOb.Xhandler; evt.OnSomeEvent() ; Console.ReadLine(); } }}

В данном примере создаются два дополнительных класса, X и Y, в которых также определяются обработчики событий, совместимые с делегатом MyEventHandler. Поэтому эти обработчики могут быть также включены в цепочку событий. Обратим внимание на то, что обработчики в классах X и Y не являются статическими. Это означает, что сначала должны быть созданы объекты каждого из этих классов, а затем в цепочку событий должны быть введены обработчики, связанные с их экземплярами.

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

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

namespace ConsoleApplication1{ // Объявить тип делегата для события, delegate void MyEventHandler(int n); // Объявить класс, содержащий событие, class MyEvent { public event MyEventHandler SomeEvent; // Этот метод вызывается для запуска события, public void OnSomeEvent(int n) { if (SomeEvent != null) SomeEvent(n); } } class Program { static void Main(string[] args) { MyEvent evt = new MyEvent(); // Использовать лямбда-выражение в качестве обработчика событий, evt.SomeEvent += (n) => Console.WriteLine("Событие получено. Значение равно " + n); // Запустить событие, evt.OnSomeEvent(1); evt.OnSomeEvent(2); Console.ReadLine(); } }}

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

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

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

// Использовать анонимный метод в качестве обработчика событий,evt.SomeEvent += delegate(int n) { Console.WriteLine("Событие получено. Значение равно " + n); };