我只是想知道。net框架究竟是如何处理事件的。
当事件触发时,所有已注册的处理程序都被调用(在新线程上?)如果没有附加处理程序,事件处理将进行到什么程度?是否有一个内部"没有监听器"标志来防止浪费周期?
这个问题是在我思考由复杂表单(尤其是WPF)生成的大量未使用事件时出现的。所有的鼠标进入/退出/等等
事件不是这样的。
就CLR而言,事件只是一对名为add_EventName
和remove_EventName
的方法。(这些被称为访问器,就像属性)
如何实现这些方法和调用处理程序取决于实现类。
通常,事件是通过将每个事件的所有处理程序存储在多播委托中来实现的(可以在编译器从隐式事件生成的支持字段中,也可以在EventHandlerList
中)。
调用多播委托将按插入顺序同步运行每个方法。
如果没有方法,它将为空。(没有空的多播委托实例)
事件是用多播委托实现的,当没有处理程序与之关联时,它是null
。在响应该事件的CLR代码中,您将看到如下内容:
void OnEventName(EventNameArgs e)
{
// Only invoke the delegate if there are handlers associated with it
if (EventNameDelegate != null)
{
EventNameDelegate(sender, e);
}
}
参见如何:在类中实现事件的例子。这就是. net中事件的典型实现方式,包括在库代码中。