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

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

<b>evt.SomeEvent += Handler;</b>

Обратите внимание на то, что обработчик добавляется в список с помощью оператора +=. События поддерживают только операторы += и -=. В данном случае метод Handler() является статическим, но в качестве обработчиков событий могут также служить методы экземпляра.

И наконец, событие запускается, как показано ниже.

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

<b>evt.OnSomeEvent();</b>

Вызов метода OnSomeEvent() приводит к вызову всех событий, зарегистрированных обработчиком. В данном случае зарегистрирован только один такой обработчик, но их может быть больше, как поясняется в следующем разделе.

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

<b>// Продемонстрировать групповую адресацию события,</b>

<b>using System;</b>

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

<b>delegate void MyEventHandler() ;</b>

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

<b>class MyEvent {</b>

<b>  public event MyEventHandler SomeEvent;</b>

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

<b>  public void OnSomeEvent() {</b>

<b>    if(SomeEvent != null)</b>

<b>      SomeEvent();</b>

<b>  }</b>

<b>}</b>

<b>class X {</b>

<b>  public void Xhandler() {</b>

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

<b>  }</b>

<b>}</b>

<b>class Y {</b>

<b>  public void Yhandler() {</b>

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

<b>  }</b>

<b>}</b>

<b>class EventDemo2 {</b>

<b>  static void Handler() {</b>

<b>    Console.WriteLine(&quot;Событие получено объектом класса EventDemo&quot;);</b>

<b>  }</b>

<b>  static void Main() {</b>

<b>    MyEvent evt = new MyEvent();</b>

<b>    X xOb = new X();</b>

<b>    Y yOb = new Y();</b>

<b>    // Добавить обработчики в список событий.</b>

<b>    evt.SomeEvent += Handler;</b>

<b>    evt.SomeEvent += xOb.Xhandler;</b>

<b>    evt.SomeEvent += yOb.Yhandler;</b>

<b>    // Запустить событие, evt.OnSomeEvent() ;</b>

<b>    Console.WriteLine() ;</b>

<b>    // Удалить обработчик.</b>

<b>    evt.SomeEvent -= xOb.Xhandler;</b>

<b>    evt.OnSomeEvent() ;</b>

<b>  }</b>

<b>}</b>

При выполнении кода этого примера получается следующий результат.

<b>Событие получено объектом класса EventDemo</b>

<b>Событие получено объектом класса X</b>

<b>Событие получено объектом класса Y</b>

<b>Событие получено объектом класса EventDemo</b>

<b>Событие получено объектом класса Y</b>

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

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

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