【问题标题】:What are the advantages of adding delegate instances to Component.Events (EventHandlerList)?将委托实例添加到 Component.Events (EventHandlerList) 有什么好处?
【发布时间】:2012-08-07 10:04:20
【问题描述】:

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

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);
}

我很想重构以使用更短的方法,但我会犹豫是否使用我缺少的组件 EventHanderList 有一些优势。

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

  • 释放组件时,EventHandlerList 中的所有项目都将被移除,从而有效地自动解除事件处理程序的挂钩。
  • 由于所有附加的委托都进入单个 EventHandlerList,内存碎片可能更少。

还有别的吗?

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

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 如果它只是关于支持字段性能改进。这听起来更像是当类中的事件属性大于 1 时语法糖应该做的编译器工作。
    猜你喜欢
    • 2014-02-27
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多