В C# разрешается формировать какие угодно разновидности событий. Но ради совместимости программных компонентов со средой .NET Framework следует придерживаться рекомендаций, установленных для этой цели корпорацией Microsoft. Эти рекомендации, по существу, сводятся к следующему требованию: у обработчиков событий должны быть два параметра. Первый из них — ссылка на объект, формирующий событие, второй — параметр типаEventArgs,содержащий любую дополнительную информацию о событии, которая требуется обработчику. Таким образом, .NET-совместимые обработчики событий должны иметь следующую общую форму.
void
// ...
}
Как правило,
Сам классEventArgsне содержит поля, которые могут быть использованы для передачи дополнительных данных обработчику. Напротив,EventArgsслужит в качестве базового класса, от которого получается производный класс, содержащий все необходимые поля. Тем не менее в классеEventArgsимеется одно полеEmptyтипаstatic,которое представляет собой объект типаEventArgsбез данных.
Ниже приведен пример программы, в которой формируется .NET-совместимое событие.
// Пример формирования .NET-совместимого события, using System;
// Объявить класс, производный от класса EventArgs. class MyEventArgs : EventArgs { public int EventNum;
}
// Объявить тип делегата для события.
delegate void MyEventHandler(object source, MyEventArgs arg);
/’/ Объявить класс, содержащий событие, class MyEvent {
static int count = 0;
// Этот метод запускает событие SomeEvent. public void OnSomeEvent {
MyEventArgs arg = new MyEventArgs;
if(SomeEvent != null) { arg.EventNum = count++;
SomeEvent(this, arg);
}
}
}
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;
}
}