例如,我有一个基本事件发布方法:
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);
}
编辑:修复了示例代码,现在应该更清楚了。