8

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

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,因此内存碎片可能更少。

还有别的事吗?

(这不是关于在事件上显式添加 + 删除的一般使用的问题。)

4

1 回答 1

12

这适用于稀疏事件。UI 控件往往有几十个(有时超过 100 个)事件。如果每个事件都使用类似字段的事件,那么每个事件都需要一个参考支持字段。对于 100 个事件,即 x86 上的 400 字节或 x64 上的 800 字节,即使没有订阅单个事件

例如,在您添加System.Windows.Forms.Form任何. 每个实例至少有69 个。Control

所以; 带有一些标签、输入框和按钮的 Windows 表单很容易有额外的 2000 个参考字段(x86 上为 16k),其中大部分是什么都不做

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

于 2012-08-10T05:35:38.710 回答