c#语言中的事件处理程序

时间:2011-10-12 18:49:38

标签: c# c#-4.0 programming-languages

class Plane 
{
    public event EventHandler Land;

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

这是事件处理程序的最佳做法:

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

真的有必要吗?在什么情况下可能与Land不同?

3 个答案:

答案 0 :(得分:6)

在多线程访问的情况下,我相信。如果你没有缓存引用,另一个线程可以在你的后卫之后但在你开火之前将其清空。

答案 1 :(得分:2)

如果你有许多线程修改Land并发。

答案 2 :(得分:1)

在测试和加注之间,最后一个处理程序被另一个线程从列表中删除。

当事件的invokation列表发生变化时,它将被复制,临时引用仍将保留原始列表。

请参阅:C# Events and Thread Safety