class Control: Component
{
// Unique keys for events
static readonly object mouseDownEventKey = new object();
static readonly object mouseUpEventKey = new object();
// Return event handler associated with key
protected Delegate GetEventHandler(object key) {...}
// Add event handler associated with key
protected void AddEventHandler(object key, Delegate handler) {...}
// Remove event handler associated with key
protected void RemoveEventHandler(object key, Delegate handler) {...}
// MouseDown event
public event MouseEventHandler MouseDown {
add { AddEventHandler(mouseDownEventKey, value); }
remove { RemoveEventHandler(mouseDownEventKey, value); }
}
// MouseUp event
public event MouseEventHandler MouseUp {
add { AddEventHandler(mouseUpEventKey, value); }
remove { RemoveEventHandler(mouseUpEventKey, value); }
}
// Invoke the MouseUp event
protected void OnMouseUp(MouseEventArgs args) {
MouseEventHandler handler;
handler = (MouseEventHandler)GetEventHandler(mouseUpEventKey);
if (handler != null)
handler(this, args);
}
}
Control类为事件实现内部存储机制。 AddEventHandler方法将委托值与键相关联 GetEventHandler方法返回当前与之关联的委托 一个键,RemoveEventHandler方法删除一个委托作为 指定事件的事件处理程序。据推测,潜在的 存储机制的设计使得没有成本 将null委托值与键相关联,因此未处理 事件不会消耗存储。
此代码和上段中的解释对我没有任何意义。知道这个内部存储机制是什么意思吗?在上一段中,将代表与卑微的意思联系起来是什么意思?
答案 0 :(得分:3)
Windows窗体控件公开了大量事件。典型的UI将由大量这些控件组成。
使用标准事件语法时
public event MouseEventHandler MouseDown;
编译器生成add
和remove
方法以及与委托相同类型的私有字段。
这意味着默认情况下会占用大量内存(即使没有订阅事件)。
Windows窗体控件定义了自己的存储方法,这意味着内存仅用于实际订阅的事件(以及存储委托EG和字典的对象),从而减少了应用程序的总内存占用量。
委托与对象键相关联,因此,例如,如果发生Mousedown
事件,它可以查找应用于该事件的委托,以便可以调用它们。
答案 1 :(得分:0)
据我所知,这种存储机制通常是为了维护弱参考模式而创建的。请查看此文章以深入了解http://msdn.microsoft.com/en-us/library/aa970850.aspx