2013-02-03 58 views
0

在所有答案的代码质疑:什么是不为空的事件处理程序检查?

存在对EventHandler handler不是空

EventHandler handler = this.somethingHappened; 
if (handler != null) 
{ 
    handler(this, EventArgs.Empty); 
} 

与认购支票:

observable.SomethingHappened += observer.HandleEvent; 

还有l在互联网上的文章,教程,例子等。
虽然我无法掌握何时以及如何处理这个处理程序可能是空的。

我读过在回答类似的问题:

,但我仍然无法掌握如何在此类的例子,说明了handler可能碰巧null

任何人都可以解释我在这段代码中的处理程序如何碰巧是null

回答

2

很简单,如果没有委托尚未分配给特定的事件处理程序,它将为空,并试图调用它将导致NullReferenceException。

在调用它之前执行空检查可防止发生此NullReferenceException。

+0

但它被分配在所有这样的例子中 – Fulproof

+0

不,它是从另一个代表复制的。被复制的值*可以为空。它被复制的原因是为调用列表创建一个快照,以便在空检查和调用之间不存在委托变为空的风险。简单的经验法则......如果事件的调用列表中没有任何内容,则该值为空。 – spender

+0

是的,正如@spender所说的,如果'this.somethingHappened'是'null',那么'handler'也将是'null'。 – JLRishe

相关问题