2011-10-12 93 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