Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将委托实例添加到Component.Events(EventHandlerList)的优点是什么?_C#_Winforms - Fatal编程技术网

C# 将委托实例添加到Component.Events(EventHandlerList)的优点是什么?

C# 将委托实例添加到Component.Events(EventHandlerList)的优点是什么?,c#,winforms,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

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

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);
}
private static readonly object LoadEvent=new object();
公共事件事件处理程序加载
{
添加{Events.AddHandler(LoadEvent,value);}
删除{Events.RemoveHandler(LoadEvent,value);}
}
受保护的虚拟void OnLoad(MyEventArg e)
{
var evnt=(EventHandler)事件[LoadEvent];
如果(evnt!=null)
evnt(本,e);
}
而不仅仅是:

public event EventHandler<MyEventArgs> Load;

protected virtual void OnLoad(MyEvent e)
{
   if (Load != null)
       Load(this, e);
}
公共事件事件处理程序加载;
受保护的虚拟void OnLoad(MyEvent e)
{
if(加载!=null)
荷载(本,e);
}
我很想通过重构来使用更短的方法,但是如果使用组件EventHanderList有一些我所缺少的优点,我会犹豫

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

  • 当组件被释放时,EventHandlerList中的所有项都将被删除,从而有效地自动解除事件处理程序的挂钩
  • 由于所有附加的委托都进入单个EventHandlerList,因此可能会减少内存碎片
还有别的吗


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

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

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

所以,;一个带有一些标签、输入框和按钮的windows窗体可以很容易地拥有额外的2000个引用字段(x86上为16k),其中大多数字段不起任何作用


EventHandlerList
本质上是一个键/值查找,这意味着如果只订阅了3个事件(我想是“单击”和其他一些事件),那么只需要少量内存。

如果只是为了提高备份字段的性能。这听起来更像是当类中的事件属性大于1时语法糖应该执行的编译器工作。