.net 如果一个事件发生,没有人在听,它会发出声音吗?

.net 如果一个事件发生,没有人在听,它会发出声音吗?,.net,events,event-handling,.net,Events,Event Handling,我只是想知道.Net框架到底是如何处理事件的 可能在触发事件时,会调用所有已注册的处理程序(在新线程上?)。如果没有附加任何处理程序,那么事件处理会走多远?是否有一个内部“没有侦听器”标志来防止浪费周期 这个问题是在我思考复杂表单(尤其是WPF)生成的大量未使用事件时提出的。所有鼠标进入/退出等事件都不是这样工作的 就CLR而言,事件只是一对名为add\u EventName和remove\u EventName的方法。(这些被称为访问器,就像属性一样) 如何实现这些方法和调用处理程序取决于实现

我只是想知道.Net框架到底是如何处理事件的

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


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

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

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

通常,事件是通过在多播委托中存储每个事件的所有处理程序来实现的(可以在编译器从隐式事件生成的支持字段中,也可以在类似
EventHandlerList
的内容中)

调用多播委托将按插入顺序同步运行每个方法。

如果没有方法,它将为null。(没有空的多播委托实例)

事件不是这样工作的

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

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

通常,事件是通过在多播委托中存储每个事件的所有处理程序来实现的(可以在编译器从隐式事件生成的支持字段中,也可以在类似
EventHandlerList
的内容中)

调用多播委托将按插入顺序同步运行每个方法。

如果没有方法,它将为null。(没有空的多播委托实例)

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

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

有关示例,请参见。这就是事件在.NET中的典型实现方式,包括在库代码中。

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

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

有关示例,请参见。这就是事件在.NET中的典型实现方式,包括在库代码中。

+1。为了更直接地回答其中一个问题,当没有人订阅某个事件时,它的值为
null
,因此必须执行检查,否则将抛出
NullReferenceException
。因此,是的,有一个标志表示“没有侦听器”,即
this.MyEvent==null
+1。为了更直接地回答其中一个问题,当没有人订阅某个事件时,它的值为
null
,因此必须执行检查,否则将抛出
NullReferenceException
。是的,有一个标志表示“没有侦听器”,即
this.MyEvent==null