Страница 237 из 502
<b>// Использовать анонимный метод в качестве обработчика событий,</b>
<b>evt.SomeEvent += delegate(int n) {</b>
<b> Console.WriteLine("Событие получено. Значение равно " + n);</b>
<b>};</b>
Как видите, синтаксис использования анонимного метода в качестве обработчика событий остается таким же, как и для его применения вместе с любым другим типом делегата.
Рекомендации по обработке событий в среде .NET Framework
В C# разрешается формировать какие угодно разновидности событий. Но ради совместимости программных компонентов со средой .NET Framework следует придерживаться рекомендаций, установленных для этой цели корпорацией Microsoft. Эти рекомендации, по существу, сводятся к следующему требованию: у обработчиков событий должны быть два параметра. Первый из них — ссылка на объект, формирующий событие, второй — параметр типа EventArgs, содержащий любую дополнительную информацию о событии, которая требуется обработчику. Таким образом, .NET-совместимые обработчики событий должны иметь следующую общую форму.
<b>void обработчик(object отправитель, EventArgs е) {</b>
<b>// ...</b>
<b>}</b>
Как правило, отправитель — это параметр, передаваемый вызывающим кодом с помощью ключевого слова this. А параметр е типа EventArgs содержит дополнительную информацию о событии и может быть проигнорирован, если он не нужен.
Сам класс EventArgs не содержит поля, которые могут быть использованы для передачи дополнительных данных обработчику. Напротив, EventArgs служит в качестве базового класса, от которого получается производный класс, содержащий все необходимые поля. Тем не менее в классе EventArgs имеется одно поле Empty типа static, которое представляет собой объект типа EventArgs без данных.
Ниже приведен пример программы, в которой формируется .NET-совместимое событие.
<b>// Пример формирования .NET-совместимого события, </b>
<b>using System; </b>
<b>// Объявить класс, производный от класса EventArgs. </b>
<b>class MyEventArgs : EventArgs { </b>
<b> public int EventNum; </b>
<b>} </b>
<b>// Объявить тип делегата для события. </b>
<b>delegate void MyEventHandler(object source, MyEventArgs arg); </b>
<b>// Объявить класс, содержащий событие, </b>
<b>class MyEvent { </b>
<b> static int count = 0; </b>
<b> public event MyEventHandler SomeEvent; </b>
<b> // Этот метод запускает событие SomeEvent. </b>
<b> public void OnSomeEvent() { </b>
<b> MyEventArgs arg = new MyEventArgs(); </b>
<b> if(SomeEvent != null) { </b>
<b> arg.EventNum = count++; </b>
<b> SomeEvent(this, arg); </b>
<b> } </b>
<b> } </b>
<b>} </b>
<b>class X { </b>
<b> public void Handler(object source, MyEventArgs arg){ </b>
<b> Console.WriteLine("Событие " + arg.EventNum + </b>
<b> " получено объектом класса X."); </b>
<b> Console.WriteLine("Источник: " + source); </b>
<b> Console.WriteLine(); </b>
<b> } </b>
<b>} </b>
<b>class Y { </b>
<b> public void Handler(object source, MyEventArgs arg){ </b>
<b> Console.WriteLine("Событие " + arg.EventNum + </b>
<b> " получено объектом класса Y."); </b>
<b> Console.WriteLine("Источник: " + source); </b>
<b> Console.WriteLine() ; </b>
<b> } </b>
<b>} </b>
<b>class EventDemo6 { </b>
<b> static void Main() { </b>
<b> X ob1 = new X(); </b>
<b> Y ob2 = new Y(); </b>
<b> MyEvent evt = new MyEvent(); </b>
<b> // Добавить обработчик Handler() в цепочку событий, </b>
<b> evt.SomeEvent += ob1. Handler; </b>
<b> evt.SomeEvent += ob2.Handler; </b>
<b> // Запустить событие, </b>
<b> evt.OnSomeEvent(); </b>
<b> evt.OnSomeEvent(); </b>
<b> } </b>
<b>} </b>