Страница 233 из 502
<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> int id;</b>
<b> public X(int x) {</b>
<b> id = x;</b>
<b> }</b>
<b> // Этот метод экземпляра предназначен в качестве обработчика событий,</b>
<b> public void Xhandler() {</b>
<b> Console.WriteLine("Событие получено объектом " + id);</b>
<b> }</b>
<b>}</b>
<b>class EventDemo3 {</b>
<b> static void Main() {</b>
<b> MyEvent evt = new MyEvent();</b>
<b> X ol = new X(1);</b>
<b> X o2 = new X(2);</b>
<b> X o3 = new X(3);</b>
<b> evt.SomeEvent += ol.Xhandler;</b>
<b> evt.SomeEvent += o2.Xhandler;</b>
<b> evt.SomeEvent += o3.Xhandler;</b>
<b> // Запустить событие,</b>
<b> evt.OnSomeEvent() ;</b>
<b> }</b>
<b>}</b>
Выполнение кода из этого примера приводит к следующему результату.
<b>Событие получено объектом 1</b>
<b>Событие получено объектом 2</b>
<b>Событие получено объектом 3</b>
Как следует из результата выполнения кода из приведенного выше примера, каждый объект должен зарегистрировать свой интерес в событии отдельно, и тогда он будет получать отдельное уведомление о событии.
С другой стороны, когда в качестве обработчика событий используется статический метод, события обрабатываются независимо от какого-либо объекта, как демонстрируется в приведенном ниже примере программы.
<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>/* Этот статический метод предназначен в качестве обработчика событий. */</b>
<b> public static void Xhandler() {</b>
<b> Console.WriteLine("Событие получено классом.");</b>
<b> }</b>
<b>}</b>
<b>class EventDemo4 {</b>
<b> static void Main() {</b>
<b> MyEvent evt = new MyEvent();</b>
<b> evt.SomeEvent += X.Xhandler;</b>
<b> // Запустить событие,</b>
<b> evt.OnSomeEvent();</b>
<b> }</b>
<b>}</b>
При выполнение кода этого примера получается следующий результат.
<b>Событие получено классом.</b>
Обратите в данном примере внимание на то, что объекты класса X вообще не создаются. Но поскольку Xhandler() является статическим методом класса X, то он может быть привязан к событию SomeEvent и выполнен при вызове метода OnSomeEvent().
В приведенных выше примерах события формировались в форме, допускавшей автоматическое управление списком вызовов обработчиков событий, включая добавление и удаление обработчиков событий из списка. Поэтому управление этим списком не нужно было организовывать вручную. Благодаря именно этому свойству такие события используются чаще всего. Тем не менее организовать управление списком вызовов обработчиков событий можно и вручную, чтобы, например, реализовать специальный механизм сохранения событий.