1

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

大概当一个事件触发时,所有注册的处理程序都会被调用(在新线程上?)。如果没有附加处理程序,事件处理能走多远?是否有内部“没有侦听器”标志来防止浪费周期?

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

4

2 回答 2

4

事件不是那样工作的。

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

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

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

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

于 2013-05-28T15:54:36.203 回答
1

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

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

有关示例,请参见如何:在您的类中实现事件。这就是事件通常在 .NET 中实现的方式,包括在库代码中。

于 2013-05-28T16:09:25.390 回答