2013-02-03 93 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

相關問題