我已经看到了各种编码风格在C#中触发事件。 第一个风格,包括如下内容:检查处理程序!= null与检查事件!= null在C#
-an事件处理
public delegate void NumberReachedEventHandler(object sender,
NumberReachedEventArgs e);
-an事件
public event NumberReachedEventHandler NumberReached;
- 以及触发事件
protected virtual void OnNumberReached(NumberReachedEventArgs e)
{
if(NumberReached != null)
{
NumberReached(this, e);
}
}
的方法然而,第二种风格却有不同的方法来触发事件:
protected virtual void OnNumberReached(NumberReachedEventArgs e)
{
NumberReachedEventHandler handler = NumberReached;
if(handler != null)
{
handler(this, e);
}
}
对我来说,似乎有一种风格检查“事件”是否为空,第二种风格检查委托是否为空。然而,我的理解是事件只是委托的一个实例,所以我想知道是否有任何编写代码的方式有优势。如果是这样,请解释。提前致谢。
重要的是要指出,这只消除了两种可能的竞态条件之一。尽管这不会解除null引用,但事件处理程序仍然可以在*取消订阅后调用,这是一个种族。 –