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

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

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

<b>event делегат_события имя_ события { </b>

<b>  add {</b>

<b>    // Код добавления события в цепочку событий.</b>

<b>  }</b>

<b>  remove {</b>

<b>    // Код удаления события из цепочки событий.</b>

<b>  }</b>

<b>}</b>

В эту форму входят два аксессора событий: add и remove. Аксессор add вызывается, когда обработчик событий добавляется в цепочку событий с помощью оператора +=. В то же время аксессор remove вызывается, когда обработчик событий удаляется из цепочки событий с помощью оператора -=.

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

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

<b>// Создать специальные средства для управления списками </b>

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

<b>using System; </b>

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

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

<b>// Объявить класс для хранения максимум трех событий, </b>

<b>class MyEvent { </b>

<b>  MyEventHandler[] evnt = new MyEventHandler[3]; </b>

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

<b>    // Добавить событие в список, </b>

<b>    add { </b>

<b>      int i; </b>

<b>      for(i=0; i &lt; 3; i++) </b>

<b>        if(evnt[i] == null) { </b>

<b>          evnt[i] = value; </b>

<b>          break; </b>

<b>        } </b>

<b>      if (i == 3) Console.WriteLine(&quot;Список событий заполнен.&quot;); </b>

<b>    } </b>

<b>    // Удалить событие из списка, </b>

<b>    remove { </b>

<b>      int i; </b>

<b>      for(i=0; i &lt; 3; i++) </b>

<b>        if(evnt[i] == value) { </b>

<b>          evnt[i] = null; </b>

<b>          break; </b>

<b>      } </b>

<b>      if (i == 3) Console.WriteLine(&quot;Обработчик событий не найден.&quot;); </b>

<b>    } </b>

<b>  } </b>

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

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

<b>    for(int i=0; i &lt; 3; i++) </b>

<b>      if(evnt[i] != null) evnt[i](); </b>

<b>  } </b>

<b>} </b>

<b>// Создать ряд классов, использующих делегат MyEventHandler. </b>

<b>class W { </b>

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

<b>    Console.WriteLine(&quot;Событие получено объектом W&quot;); </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 Z { </b>

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

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

<b>  } </b>

<b>} </b>