如果事件发生并且没有人在听,它会发出声音吗?

时间:2013-05-28 15:51:15

标签: .net events event-handling

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

假设事件触发,所有已注册的处理程序都会被调用(在新线程上?)。如果没有附加处理程序,事件处理到底有多远?是否有内部的“没有听众”标志来防止浪费周期?

问题来自我正在思考复杂形式(尤其是WPF)生成的大量未使用事件。所有鼠标都进入/退出/等。

2 个答案:

答案 0 :(得分:4)

事件不会那样。

就CLR而言,事件只是一对名为add_EventNameremove_EventName的方法。 (这些被称为访问者,就像属性一样)

如何实现这些方法并调用处理程序取决于实现类。

通常,事件是通过在多播委托中存储每个事件的所有处理程序来实现的(在隐式事件的编译器生成的支持字段中,或者在EventHandlerList之类的事件中)。

调用多播委托将按插入顺序同步运行每个方法 如果没有方法,则它将为null。 (没有空的多播委托实例)

答案 1 :(得分:1)

使用多播委托实现事件,当没有与之关联的处理程序时,null。在响应事件的CLR代码中,您将看到如下内容:

void OnEventName(EventNameArgs e)
{
    // Only invoke the delegate if there are handlers associated with it
    if (EventNameDelegate != null)
    {
        EventNameDelegate(sender, e);
    }
}

有关示例,请参阅How to: Implement Events in Your Class。这就是事件通常在.NET中实现的方式,包括在库代码中。