Страница 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 < 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("Список событий заполнен."); </b>
<b> } </b>
<b> // Удалить событие из списка, </b>
<b> remove { </b>
<b> int i; </b>
<b> for(i=0; i < 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("Обработчик событий не найден."); </b>
<b> } </b>
<b> } </b>
<b> // Этот метод вызывается для запуска событий, </b>
<b> public void OnSomeEvent() { </b>
<b> for(int i=0; i < 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("Событие получено объектом W"); </b>
<b> } </b>
<b>} </b>
<b>class X { </b>
<b> public void Xhandler() { </b>
<b> Console.WriteLine("Событие получено объектом X"); </b>
<b> } </b>
<b>} </b>
<b>class Y { </b>
<b> public void Yhandler() { </b>
<b> Console.WriteLine("Событие получено объектом Y"); </b>
<b> } </b>
<b>} </b>
<b>class Z { </b>
<b> public void Zhandler() { </b>
<b> Console.WriteLine("Событие получено объектом Z"); </b>
<b> } </b>
<b>} </b>