事件的内部存储机制

时间:2013-04-10 11:16:59

标签: c# events

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委托值与键相关联,因此未处理   事件不会消耗存储。

此代码和上段中的解释对我没有任何意义。知道这个内部存储机制是什么意思吗?在上一段中,将代表与卑微的意思联系起来是什么意思?

2 个答案:

答案 0 :(得分:3)

Windows窗体控件公开了大量事件。典型的UI将由大量这些控件组成。

使用标准事件语法时

public event MouseEventHandler MouseDown;

编译器生成addremove方法以及与委托相同类型的私有字段。

这意味着默认情况下会占用大量内存(即使没有订阅事件)。

Windows窗体控件定义了自己的存储方法,这意味着内存仅用于实际订阅的事件(以及存储委托EG和字典的对象),从而减少了应用程序的总内存占用量。

委托与对象键相关联,因此,例如,如果发生Mousedown事件,它可以查找应用于该事件的委托,以便可以调用它们。

答案 1 :(得分:0)

据我所知,这种存储机制通常是为了维护弱参考模式而创建的。请查看此文章以深入了解http://msdn.microsoft.com/en-us/library/aa970850.aspx