gpt4 book ai didi

c# - 为什么将事件处理程序复制到另一个变量中

转载 作者:行者123 更新时间:2023-12-04 14:21:51 26 4
gpt4 key购买 nike

在一个例子中,我找到了这个代码:

public event EventHandler ThresholdReached;

protected virtual void OnThresholdReached(EventArgs e)
{
EventHandler handler = ThresholdReached;
if (handler != null)
handler(this, e);
}

我想了解该行的原因:
EventHandler handler = ThresholdReached;

我们能不能不这样做:
public event EventHandler ThresholdReached;

protected virtual void OnThresholdReached(EventArgs e)
{
if (ThresholdReached != null)
ThresholdReached(this, e);
}

这两种方式是否有一些优点/缺点?

最佳答案

在第二个版本中存在线程竞争的理论风险,即有人取消订阅检查和调用之间的事件,导致 NullReferenceException在调用步骤中。将值捕获到本地并进行测试/调用以防止这种情况发生。但是,也许可以使用 C# 6 或更高版本的第三个版本(感谢 @Cid):

ThresholdReached?.Invoke(this, e);

这基本上是第一个版本的简写版本 - 所有的安全性,但现在简洁。

关于c# - 为什么将事件处理程序复制到另一个变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59301612/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com