Класс EventArgs
необходим, потому что, если вы хотите расширить свое событие, чтобы предоставить больше информации в будущем, у вас будут проблемы с переносимостью для всех клиентов, использующих исходную сигнатуру метода исходного события.
Например,
public void IHandleEventVersion1(string p1, int p2)
{
....
}
Теперь вы хотите предоставить больше информации в событии EventVersion1
выше (вы хотите включить char
). Затем вам придется заставить клиента переписать свою обработку событий, чтобы она соответствовала вашим новым требованиям, например:
public void IHandleEventVersion1(string p1, int p2, char p2)
{
...
}
Видите, как неловко это может быть при попытке предоставить больше информации?
Итак, класс EventArgs
предоставляет общий шаблон проектирования для программирования, позволяя вам и мне быстро расширять данные, которые мы хотим предоставить для события.
Общий шаблон кодирования структуры событий таков:
Основная стратегия обработки событий
- Определите
event
, на который потребители вашего класса могут подписаться
- Определите
delegate
подпись, которую объявляет событие (да, вы также можете использовать универсальную версию .NET 2.0 EventHandler
, а именно EventHandler<TEventArgs>
)
- Предоставьте метод
protected
virtual
для наследников, которые необходимо переопределить в ответ на событие, вызываемое в базовом классе
В базовом классе, который объявляет ваше событие, предоставьте базовую реализацию метода protected
, в которой вы фактически вызываете событие.
public class MyClass
{
public event EventHandler /* (point 2) */ MyEvent; /* (point 1) */
// (point 3 + 4)
protected virtual void OnMyEvent()
{
EventHandler temp = MyEvent;
if (temp != null)
temp(this, EventArgs.Empty);
}
public void SomeMethodThatWillRaiseTheEvent()
{
....
OnMyEvent();
}
}