И наконец, событие запускается, как показано ниже.
// Запустить событие, evt.OnSomeEvent();
Вызов метода OnSomeEvent () приводит к вызову всех событий, зарегистрированных обработчиком. В данном случае зарегистрирован только один такой обработчик, но их может быть больше, как поясняется в следующем разделе.
Пример групповой адресации события
Как и делегаты, события поддерживают групповую адресацию. Это дает возможность нескольким объектам реагировать на уведомление о событии. Ниже приведен пример групповой адресации события.
// Продемонстрировать групповую адресацию события, using System;
// Объявить тип делегата для события, delegate void MyEventHandler() ;
// Объявить делегат, содержащий событие, class MyEvent {
Public event MyEventHandler SomeEvent;
// Этот метод вызывается для запуска события, public void OnSomeEvent() {
if(SomeEvent != null)
SomeEvent();
}
}
class X {
public void XhandlerO {
Console.WriteLine("Событие получено объектом класса X");
}
class Y {
public void YhandlerO {
Console.WriteLine("Событие получено объектом класса Y");
}
}
class EventDemo2 {
static void Handler() {
Console.WriteLine("Событие получено объектом класса EventDemo");
}
static void Main() {
MyEvent evt = new MyEvent ();
X xOb = new X();
Y yOb = new Y();
// Добавить обработчики в список событий.
evt.SomeEvent += Handler;
evt.SomeEvent += xOb.Xhandler;
evt.SomeEvent += yOb.Yhandler;
// Запустить событие, evt.OnSomeEvent() ;
Console.WriteLine() ;
// Удалить обработчик.
evt.SomeEvent -= xOb.Xhandler;
Evt.OnSomeEvent() ;
}
}
При выполнении кода этого примера получается следующий результат.
Событие получено объектом класса EventDemo Событие получено объектом класса X Событие получено объектом класса Y
Событие получено объектом класса EventDemo Событие получено объектом класса Y
В данном примере создаются два дополнительных класса, X и Y, в которых также определяются обработчики событий, совместимые с делегатом MyEventHandler. Поэтому эти обработчики могут быть также включены в цепочку событий. Обратите внимание на то, что обработчики в классах X и Y не являются статическими. Это означает, что сначала должны быть созданы объекты каждого из этих классов, а затем в цепочку событий должны быть введены обработчики, связанные с их экземплярами. Об отличиях между обработчиками экземпляра и статическими обработчиками речь пойдет в следующем разделе.
Методы экземпляра в сравнении со статическими методами в качестве обработчиков событий
Методы экземпляра и статические методы могут быть использованы в качестве обработчиков событий, но между ними имеется одно существенное отличие. Когда
Статический метод используется в качестве обработчика, уведомление о событии распространяется на весь класс. А когда в качестве обработчика используется метод экземпляра, то события адресуются конкретным экземплярам объектов. Следовательно, каждый объект определенного класса, которому требуется получить уведомление о событии, должен быть зарегистрирован отдельно. На практике большинство обработчиков событий представляет собой методы экземпляра, хотя это, конечно, зависит от конкретного приложения. Рассмотрим применение каждой из этих двух разновидностей методов в качестве обработчиков событий на конкретных примерах.
В приведенной ниже программе создается класс X, в котором метод экземпляра определяется в качестве обработчика событий. Это означает, что каждый объект класса X должен быть зарегистрирован отдельно, чтобы получать уведомления о событиях. Для демонстрации этого факта в данной программе производится групповая адресация события трем отдельным объектам класса X.
/* Уведомления о событиях получают отдельные объекты, когда метод экземпляра используется в качестве обработчика событий. */
Using System;
// Объявить тип делегата для события, delegate void MyEventHandler() ;
// Объявить класс, содержащий событие, class MyEvent {