2011-10-12 125 views
2
class Plane 
{ 
    public event EventHandler Land; 

    protected void OnLand() 
    { 
     if (null != Land) 
     { 
      Land(this, null); 
     } 
    } 
} 

它是事件處理程序做,而不是最好的做法:事件處理程序在C#語言

EventHandler temp = Land; 
if (null != temp) 
{ 
    temp(this, null); 
} 

那是真的有必要嗎?在什麼情況下,土地的溫度可能會不同?

+0

我看不到您訂閱活動的位置。如果您要嘗試更新用戶界面,您可能還需要檢查是否需要調用。 –

回答

6

在多線程訪問的情況下,我相信。如果你不緩存引用,另一個線程可以在你的警戒之後但在你開火之前將它清空。

+0

我很確定,因爲EventHandler是一個引用類型,如果在無效性檢查之後但在調用之前Land沒有被使用,它仍然會拋出一個NullReferenceException –

+0

這就是我的觀點。您將參考緩存爲「temp」作爲最佳做法,以避免發生並且不拋出異常。 Temp繼續指向方法範圍的內存對象,因此調用temp不會引發異常。 –

+0

對不起。這不是我習慣參考操作的方式。但一個快速的抓痕程序揭示了我的錯誤。 –

2

如果你有許多線程併發修改Land

1

當在測試和提升之間時,最後一個處理程序被另一個線程從列表中移除。

事件的調用列表將在其更改時複製並且臨時引用仍將保留原始列表。

請參閱:C# Events and Thread Safety