我見過很多開發人員想要調用Event
,他們將它分配給一個名爲handler
的本地變量,並調用handler
而不是直接調用Event
。 爲什麼我們不直接調用事件?爲什麼我們不直接調用事件?
private void OnSomethingChanged(EventArgs e)
{
if (SomethingEvent != null)
{
SomethingEvent(this, e);
}
}
我見過很多開發人員想要調用Event
,他們將它分配給一個名爲handler
的本地變量,並調用handler
而不是直接調用Event
。 爲什麼我們不直接調用事件?爲什麼我們不直接調用事件?
private void OnSomethingChanged(EventArgs e)
{
if (SomethingEvent != null)
{
SomethingEvent(this, e);
}
}
您發佈的代碼基本上不是線程安全的。如果最終用戶退訂後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>
了。
感謝您的回覆,這是驚人的提示 – saber 2012-07-30 21:18:54
如果未複製事件(僅與多線程應用程序相關),則存在爭用條件的可能性。
如果一個線程退出null
檢查後不再訂閱事件,您將得到一個NullReferenceException
。
+1感謝您的優秀解釋。 – saber 2012-07-30 21:26:54
我也不明白爲什麼。有一個簡單而又非常安全的方法:
// 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);
}
另請參見Eric Lippert的[活動和賽事](http://blogs.msdn.com/b/ericlippert/archive/2009/04/29/events-and -races.aspx) – Brian 2012-07-31 04:50:28