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