2013-08-02 98 views
3

我已经看到了各种编码风格在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); 
     } 
    } 

对我来说,似乎有一种风格检查“事件”是否为空,第二种风格检查委托是否为空。然而,我的理解是事件只是委托的一个实例,所以我想知道是否有任何编写代码的方式有优势。如果是这样,请解释。提前致谢。

回答

0

据我了解this答案,第一个是不是线程安全的,而第二个是。

protected virtual void OnNumberReached(NumberReachedEventArgs e) 
{ 
    //If number reached is changed from after this check 
    if(NumberReached != null) 
    { 
     //and between this call, it could still result in a 
     //NullReferenceException 
     NumberReached(this, e); 
    } 
} 
+0

重要的是要指出,这只消除了两种可能的竞态条件之一。尽管这不会解除null引用,但事件处理程序仍然可以在*取消订阅后调用,这是一个种族。 –