// Код добавления события в цепочку событий.
}
remove {
// Код удаления события из цепочки событий.
}
}
В эту форму входят два аксессора событий:addиremove.Аксессорaddвызывается, когда обработчик событий добавляется в цепочку событий с помощью оператора +=. В то же время аксессорremoveвызывается, когда обработчик событий удаляется из цепочки событий с помощью оператора -=.
Когда вызывается аксессорaddилиremove,он принимает в качестве параметра добавляемый или удаляемый обработчик. Как и в других разновидностях аксессоров, этот неявный параметр называетсяvalue.Реализовав аксессорыaddилиremove,можно организовать специальную схему хранения обработчиков событий. Например, обработчики событий можно хранить в массиве, стеке или очереди.
Ниже приведен пример программы, демонстрирующей аксессорную форму события. В ней для хранения обработчиков событий используется массив. Этот массив состоит всего из трех элементов, поэтому в цепочке событий можно хранить одновременно только три обработчика.
// Создать специальные средства для управления списками // вызова обработчиков событий.
using System;
// Объявить тип делегата для события.
delegate void MyEventHandler; ,
// Объявить класс для хранения максимум трех событий, class MyEvent {
MyEventHandler[] evnt = new MyEventHandler[3];
public event MyEventHandler SomeEvent {
// Добавить событие в список, add { int i;
for(i=0; i < 3; i++) if(evnt[i] == null) { evnt[i] = value; break;
}
if (i == 3) Console.WriteLine("Список событий заполнен.");
}
// Удалить событие из списка, remove { int i;
for(i=0; i < 3; i++) if(evnt[i] == value) { evnt[i] = null; break;
}
if (i == 3) Console.WriteLine("Обработчик событий не найден.");
}
}
// Этот .метод вызывается для запуска событий, public void OnSomeEvent {
for(int i=0; i < 3; i++)
if(evnt[i] != null) evnt[i];
}
}
// Создать ряд классов, использующих делегат MyEventHandler. class W {
public void Whandler {
Console.WriteLine("Событие получено объектом W");
}
}
class X {
public void Xhandler {
Console.WriteLine("Событие получено объектом X");
}
}
class Y {
public void Yhandler {
Console.WriteLine("Событие получено объектом Y");
class Z {
public void Zhandler {
Console.WriteLine("Событие получено объектом Z");
}
}
class EventDemo5 { static void Main {
MyEvent evt = new MyEvent;
// Добавить обработчики в цепочку событий.
Console.WriteLine("Добавление событий."); evt.SomeEvent += wOb.Whandler; evt.SomeEvent += xOb.Xhandler; evt.SomeEvent += yOb.Yhandler;
// Сохранить нельзя - список заполнен, evt.SomeEvent += zOb.Zhandler;