在从类组件派生的类中,我有时会看到声明为:
的事件private static readonly object LoadEvent = new object();
public event EventHandler<MyEventArgs> Load
{
add { Events.AddHandler(LoadEvent, value); }
remove { Events.RemoveHandler(LoadEvent, value); }
}
protected virtual void OnLoad(MyEventArg e)
{
var evnt = (EventHandler<MyEventArg>)Events[LoadEvent];
if (evnt != null)
evnt(this, e);
}
而不仅仅是:
public event EventHandler<MyEventArgs> Load;
protected virtual void OnLoad(MyEvent e)
{
if (Load != null)
Load(this, e);
}
我很想重构使用更短的方法,但是如果使用我缺少的Component EventHanderList有一些优点,我会犹豫不决。
我目前唯一能想到的优点是:
还有别的吗?
(这是不关于事件中显式添加+删除的一般用法的问题。)
答案 0 :(得分:9)
这对稀疏事件有好处。 UI控件往往有数十个(有时超过100个)事件。如果每个事件都使用了类似字段的事件,那么每个事件都需要一个引用后备字段。使用100个事件,即x86上的400个字节或x64上的800个字节, ,即使订阅的是单个事件 。
例如,在您添加任何之前,winforms System.Windows.Forms.Form
有91个事件。每个Control
个实例的至少 69。
因此;带有几个标签,输入框和按钮的Windows窗体可以轻松拥有额外的2000个参考字段(x86上的16k)其中大部分都无效。
EventHandlerList
本质上是一个键/值查找,这意味着如果只订阅了3个事件(我在想“点击”,也许还有其他几个),那么只需要一定量的内存。