我只是想知道.Net框架究竟是如何处理事件的。
假设事件触发,所有已注册的处理程序都会被调用(在新线程上?)。如果没有附加处理程序,事件处理到底有多远?是否有内部的“没有听众”标志来防止浪费周期?
问题来自我正在思考复杂形式(尤其是WPF)生成的大量未使用事件。所有鼠标都进入/退出/等。
答案 0 :(得分:4)
事件不会那样。
就CLR而言,事件只是一对名为add_EventName
和remove_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中实现的方式,包括在库代码中。