2012-07-30 55 views
3

我見過很多開發人員想要調用Event,他們將它分配給一個名爲handler的本地變量,並調用handler而不是直接調用Event。 爲什麼我們不直接調用事件?爲什麼我們不直接調用事件?

private void OnSomethingChanged(EventArgs e) 
{ 
    if (SomethingEvent != null) 
    { 
     SomethingEvent(this, e); 
    } 
} 
+0

另請參見Eric Lippert的[活動和賽事](http://blogs.msdn.com/b/ericlippert/archive/2009/04/29/events-and -races.aspx) – Brian 2012-07-31 04:50:28

回答

5

您發佈的代碼基本上不是線程安全的。如果最終用戶退訂if查詢但之前調用,您將得到一個NullReferenceException

一種選擇是寫一個擴展方法:

public static void NullSafeInvoke(this EventHandler handler, 
            object sender, EventArgs e) 
{ 
    if (handler != null) 
    { 
     handler(this, e); 
    } 
} 

然後你可以寫:

private void OnSomethingChanged(EventArgs e) 
{ 
    SomethingEvent.NullSafeInvoke(this, e); 
} 

你可能會想另一個過載EventHandler<T>了。

+0

感謝您的回覆,這是驚人的提示 – saber 2012-07-30 21:18:54

4

如果未複製事件(僅與多線程應用程序相關),則存在爭用條件的可能性。

如果一個線程退出null檢查後不再訂閱事件,您將得到一個NullReferenceException

+0

+1感謝您的優秀解釋。 – saber 2012-07-30 21:26:54

0

我也不明白爲什麼。有一個簡單而又非常安全的方法:

// when constructing of instance, to create empty subscription 
public event EventHandler SomethingEvent = delegate { }; 

private void OnSomethingChanged(EventArgs e) 
{ 
    // and call it directly 
    SomethingEvent(this, e); 
} 
相關問題