Например, у меня есть базовый метод публикации событий:
protected virtual OnSomeEvent(EventArgs e)
{
var handler = SomeEvent;
if (handler != null)
{
handler(this, e);
// handler(this, new EventArgs());// EDIT: Yes it should be
// handler(this, e),
// ignore this one :D
}
}
Для производного класса, который переопределяет OnSomeEvent
и вызывает дополнительное событие при срабатывании:
protected override OnSomeEvent(EventArgs e)
{
base.OnSomeEvent(e);
if (ExtendedEvent != null)
{
OnExtendedEvent(e);
}
}
protected void OnExtendedEvent(EventArgs e)
{
// some stuff done
// new information the ExtendedEventArgs object needs
// is not available until this point
ExtendedEvent(this, new ExtendedEventArgs(someStuff, someOtherStuff));
}
И если наследование будет продолжаться таким образом, будет создан новый производный EventArgs для каждого поколения производного класса, который в нем нуждается. Однако кажется, что различные производные EventArgs
в среде .NET не предназначены для изменения (без сеттеров), это препятствует тому, чтобы объект сохранял один экземпляр EventArgs и модифицировал его по ходу дела.
Таким образом, каждый раз, когда возникает подобное событие, оно будет перераспределять память для всех задействованных EventArgs
объектов. В приложении с интенсивным использованием графики, где событие может запускаться десятки раз в секунду (например, событие OnPaint
на элементе управления), действительно ли это хорошая практика?
Должен ли я внести некоторые изменения в OnExtendedEvent()
и сделать ExtendedEventArgs
изменяемым, чтобы было возможно следующее?
protected ExtendedEventArgs extendedArgs = ExtendedEventArgs.Empty;
protected void OnExtendedEvent(EventArgs e)
{
// some stuff done
// new information the ExtendedEventArgs object needs
// is not available until this point
extendedArgs.someProperty1 = someStuff;
extendedArgs.someProperty2 = someOtherStuff;
ExtendedEvent(this, extendedArgs);
}
РЕДАКТИРОВАТЬ: исправлен код примера, теперь должно быть понятнее.