}

class X {

public void Handler(object source, MyEventArgs arg) { Console.WriteLine("Событие " + arg.EventNum +

" получено объектом класса X."); Console.WriteLine("Источник: " + source);

Console.WriteLine();

}

}

class Y {

public void Handler(object source, MyEventArgs arg) { Console.WriteLine("Событие " + arg.EventNum +

" получено объектом класса Y."); Console.WriteLine("Источник: " + source);

Console.WriteLine() ;

}

}

class EventDemo6 { static void Main() {

X obi = new X ();

Y ob2 = new Y ();

MyEvent evt - new* MyEvent ();

// Добавить обработчик Handler() в цепочку событий, evt ..SomeEvent += obi. Handler; evt.SomeEvent += ob2.Handler;

// Запустить событие, evt.OnSomeEvent(); evt.OnSomeEvent();

}

}

Ниже приведен результат выполнения этой программы.

Событие 0 получено объектом класса X Источник: MyEvent

Событие 0 получено объектом класса Y Источник: MyEvent

Событие 1 получено объектом класса X Источник: MyEvent

Событие 1 получено объектом класса Y Источник: MyEvent

В данном примере создается классMyEventArgs,производный от классаEventArgs.В классеMyEventArgsдобавляется лишь одно его собственное поле:EventNum.Затем объявляется делегатMyEventHandler,принимающий два параметра, требующиеся для среды .NET Framework. Как пояснялось выше, первый параметр содержит ссылку на объект, формирующий событие, а второй параметр — ссылку на объект классаEventArgsили производного от него класса. Обработчики событийHandler (), определяемые в классахXиY,принимают параметры тех же самых типов.

В классеMyEventобъявляется событиеSomeEventтипаMyEventHandler.Это событие запускается в методеOnSomeEvent() с помощью делегатаSomeEvent,которому в качестве первого аргумента передается ссылкаthis,а вторым аргументом служит экземпляр объекта типаMyEventArgs.Таким образом, делегату типаMyEventHandlerпередаются надлежащие аргументы в соответствии с требованиями совместимости со средой .NET.

Применение делегатов EventHandler и EventHandler

В приведенном выше примере программы объявлялся собственный делегат события. Но как правило, в этом не никакой необходимости, поскольку в среде .NET Framework предоставляется встроенный обобщенный делегат под названиемEventHandler.(Более подробно обобщенные типы рассматриваются в главе 18.) В данном случае типTEventArgsобозначает тип аргумента, передаваемого параметруEventArgsсобытия. Например, в приведенной выше программе событиеSomeEventможет быть объявлено в классеMyEventследующим образом.

public event EventHandler SomeEvent;

Перейти на страницу:

Похожие книги