Событие получено объектом Y.

Событие получено объектом Z.

Событие получено объектом W.

Добавляем обработчик zOb.Zhandler.

Событие получено объектом Y.

Событие получено объектом W.

Обработчик события не найден.

Попытка повторно удалить обработчик xOb.Xhandler.

Событие получено объектом Y.

Событие получено объектом W.

Удаляем обработчик xOb.Xhandler.

Событие получено объектом Y.

Событие получено объектом X.

Событие получено объектом W.

Список обработчиков событий полон.

Добавление обработчиков событий.

Console.WriteLine(

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 WhandlerO {

Console.WriteLine("Событие получено объектом W.")

}}

class X {

public void XhandlerO {

Console.WriteLine("Событие получено объектом X.");

}}

class Y {

public void YhandlerO {

Console.WriteLine("Событие получено объектом Y.");

}}

class Z {

public void ZhandlerO {

Console.WriteLine("Событие получено объектом Z.")

}}

class EventDemo {

public static void Main() {

MyEvent evt = new MyEvent();

W wOb = new W();

X xOb = new X();

Y yOb = new Y ();

Z zOb = new Z ();

// Добавляем обработчики в список.

Console.WriteLine("Добавление обработчиков событий.");

evt.SomeEvent += new MyEventHandler(wOb.Whandler);

evt.SomeEvent += new MyEventHandler(xOb.Xhandler);

evt.SomeEvent += new MyEventHandler(yOb.Yhandler);

// Этот обработчик сохранить нельзя — список полон,

evt.SomeEvent += new MyEventHandler(zOb.Zhandler);

Console.WriteLine();

// Генерируем события.

evt.OnSomeEvent();

Console.WriteLine();

// Удаляем обработчик из списка.

Console.WriteLine("Удаляем обработчик xOb.Xhandler.");

evt.SomeEvent -= new MyEventHandler(xOb.Xhandler);

evt.OnSomeEvent();

Console.WriteLine();

// Пытаемся удалить его еще раз.

"Попытка повторно удалить обработчик xOb.Xhandler.");

evt.SomeEvent -= new MyEventHandler(xOb.Xhandler);

evt.OnSomeEvent();

Console.WriteLine();

// Теперь добавляем обработчик Zhandler.

Console.WriteLine("Добавляем обработчик zOb.Zhandler.")

evt. SomeEvent += new MyEventHandler (zOb. Z*handler) ;

evt.OnSomeEvent();

}}

Вот результаты выполнения программы:

Сначала определяется делегат обработчика события MyEventHandler. Код класса MyEvent, как показано в следующейинструкции, начинается с определения трехэлементного массива обработчиков событий evnt.

MyEventHandler[] evnt = new MyEventHandler[3];

Этот массив предназначен для хранения обработчиков событий, которые добавлены в цепочку событий. Элементы массива evnt инициализируются null-значениямипо умолчанию.

Приведем event-инструкцию, в которой используются событийные средства доступа.

public event MyEventHandler SomeEvent {

// Добавляем обработчик события в список,

add {

int i ;

for(i=0; i < 3;i++)

if(evnt[i] == null) {evnt[ij = 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("Обработчик события не найден.");

}}

При добавлении в список обработчика событий вызывается add-средство, и ссылка на этот обработчик (содержащаяся в параметре value) помещается в первый встретившийся неиспользуемый элемент массива evnt. Если свободных элементов нет,выдается сообщение об ошибке. Поскольку массив evnt рассчитан на хранение лишьтрех элементов, он может принять только три обработчика событий. При удалениизаданного обработчика событий вызывается remove-средство, и в массиве evnt выполняется поиск ссылки на обработчик, переданной в параметре value. Если ссылканайдена, в соответствующий элемент массива помещается значение null , что равнозначно удалению обработчика из списка.При генерировании события вызывается метод OnSomeEvent(). Он в цикле просматривает массив evnt, по очереди вызывая каждый обработчик событий.

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