Например, у меня есть метод публикации базовых событий:
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 Framework не предназначены для изменчивости (без установщиков), это препятствует объекту сохранять один экземпляр 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);
}
РЕДАКТИРОВАТЬ: Исправлен пример кода, теперь должен быть яснее.