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时语法糖应该执行的编译器工作。