如果一个事件触发而没有人在监听,它会发出声音吗?



我只是想知道。net框架究竟是如何处理事件的。

当事件触发时,所有已注册的处理程序都被调用(在新线程上?)如果没有附加处理程序,事件处理将进行到什么程度?是否有一个内部"没有监听器"标志来防止浪费周期?

这个问题是在我思考由复杂表单(尤其是WPF)生成的大量未使用事件时出现的。所有的鼠标进入/退出/等等

事件不是这样的。

就CLR而言,事件只是一对名为add_EventNameremove_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中事件的典型实现方式,包括在库代码中。

最新更新