在一个例子中,我找到了这个代码:
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/