Добавить в цитаты Настройки чтения

Страница 237 из 502

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

<b>evt.SomeEvent += delegate(int n) {</b>

<b>  Console.WriteLine(&quot;Событие получено. Значение равно &quot; + 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(&quot;Событие &quot; + arg.EventNum + </b>

<b>            &quot; получено объектом класса X.&quot;); </b>

<b>    Console.WriteLine(&quot;Источник: &quot; + 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(&quot;Событие &quot; + arg.EventNum + </b>

<b>           &quot; получено объектом класса Y.&quot;); </b>

<b>    Console.WriteLine(&quot;Источник: &quot; + 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>