Ниже приведен результат выполнения этой программы.
Событие 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
В приведенном выше примере программы объявлялся собственный делегат события. Но как правило, в этом не никакой необходимости, поскольку в среде .NET Framework предоставляется встроенный обобщенный делегат под названиемEventHandler
public event EventHandler
В общем, рекомендуется пользоваться именно таким способом, а не определять собственный делегат.
Для обработки многих событий параметр типаEventArgsоказывается ненужным. Поэтому с целью упростить создание кода в подобных ситуациях в среду .NET Framework внедрен необобщенный делегат типаEventHandler.Он может быть использован для объявления обработчиков событий, которым не требуется дополнительная информация о событиях. Ниже приведен пример использования делегатаEventHandler.
// Использовать встроенный делегат EventHandler. using System;
// Объявить класс, содержащий событие, class MyEvent {
public event EventHandler SomeEvent; // использовать делегат EventHandler
// Этот метод вызывается для запуска события.
public void OnSomeEvent {
if(SomeEvent != null)