将委托实例添加到Component.Events(EventHandlerList)有什么好处?

时间:2012-08-10 05:30:06

标签: c# winforms

在从类组件派生的类中,我有时会看到声明为:

的事件
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有一些优点,我会犹豫不决。

我目前唯一能想到的优点是:

  • 当部署组件时,将删除EventHandlerList中的所有项目,从而有效地自动解除事件处理程序。
  • 由于所有附加的委托进入单个EventHandlerList,可能会减少内存碎片。

还有别的吗?

(这是关于事件中显式添加+删除的一般用法的问题。)

1 个答案:

答案 0 :(得分:9)

这对稀疏事件有好处。 UI控件往往有数十个(有时超过100个)事件。如果每个事件都使用了类似字段的事件,那么每个事件都需要一个引用后备字段。使用100个事件,即x86上的400个字节或x64上的800个字节, ,即使订阅的是单个事件

例如,在您添加任何之前,winforms System.Windows.Forms.Form有91个事件。每个Control个实例的至少 69。

因此;带有几个标签,输入框和按钮的Windows窗体可以轻松拥有额外的2000个参考字段(x86上的16k)其中大部分都无效

EventHandlerList本质上是一个键/值查找,这意味着如果只订阅了3个事件(我在想“点击”,也许还有其他几个),那么只需要一定量的内存。