C#EventHandler文档代码示例

C#EventHandler文档代码示例,c#,.net,C#,.net,我正在阅读有关EventHandler的.NET文档,不理解以下代码片段: 局部变量处理程序的作用是什么?为什么不直接调用tresholdreachtresholdreach?.invoke(这个,e)? 类似的例子如下: 局部变量处理程序的作用是什么 可能没有。在代码正确性方面当然没有理由。它似乎是旧的、前null条件运算符版本的文档的保留,其中需要将事件字段thresholdReach复制到局部变量中,以便安全解决引发事件和可能取消订阅的任何其他代码之间的争用条件。正如您所指出的,使用nu

我正在阅读有关EventHandler的.NET文档,不理解以下代码片段:

局部变量处理程序的作用是什么?为什么不直接调用
tresholdreach
tresholdreach?.invoke(这个,e)? 类似的例子如下:

局部变量处理程序的作用是什么

可能没有。在代码正确性方面当然没有理由。它似乎是旧的、前null条件运算符版本的文档的保留,其中需要将事件字段
thresholdReach
复制到局部变量中,以便安全解决引发事件和可能取消订阅的任何其他代码之间的争用条件。正如您所指出的,使用null条件运算符,代码可以只是一行,通过事件字段本身进行调用

我之所以说“可能”,是因为我想文档的作者希望通过更明确的代码形式实现其他一些教学目标的可能性很小。但我无法想象这可能是什么,这显然干扰了对代码的一般理解(即,分散了对重要部分的注意力)

我在页面上提交了一条评论,让微软知道这个问题。我认为,如果您愿意,在Microsoft Git repo中也可能有一个地方可以提交文档问题


我的经验是,无论以何种方式将问题传达给微软,他们通常都会在相对较短的时间内解决问题。我猜在接下来的几周内,这段文字将被修正,这个问题将不再相关

最后,我在发布了这个问题后几乎立刻找到了答案(这个问题困扰了我好几天)。 阅读@lc.的答案,并对这些问题进行评论: 引导我进入这一页:

所以答案是:本地处理程序变量有效地复制了不可变委托并使其成为线程安全的。 他们本可以在医生的页面上提到的

编辑:
请参阅@Peter Duniho答案和注释。

局部变量
处理程序的用途是什么,在本例中没有,这只是一个简短的示例,说明
事件
对象是强类型的。我认为编译器无论如何都会去掉局部变量。“所以答案是:局部处理程序变量有效地复制了不可变委托并使其成为线程安全的”——这不是一个真正的答案,因为如果没有局部变量副本,代码就已经是线程安全的了。事实上,这似乎是你问题的关键所在。我看不出过期文档或博客文章如何解决与过期技术是否仍然相关的问题。复制事件处理程序实例一开始就不是线程安全的。因此,当使用null条件运算符而不是!=没有种族危险吗?(怎么会这样?有关于它的文章吗?)。例如,请参见、、和。@Camiloterevento:不,它不能,因为注释不用于回答问题。它甚至在提示中说:“避免在评论中回答问题”。从技术的角度来看,说明多余的代码实际上是否多余当然不是一种观点(注意,我没有试图解决任何非技术方面的问题,这是正确的)。
class Counter
{
    public event EventHandler ThresholdReached;

    protected virtual void OnThresholdReached(EventArgs e)
    {
        EventHandler handler = ThresholdReached;
        handler?.Invoke(this, e);
    }

    // provide remaining implementation for the class
}