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

本文关键字:事件处理 程序 语言 | 更新日期: 2023-09-27 18:11:17

class Plane 
{
    public event EventHandler Land;
    protected void OnLand()
    {
        if ( null != Land ) 
        {
            Land( this, null );
        }
    }
}

事件处理程序的最佳实践是:

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

这真的有必要吗?在什么情况下temp和Land会不同?

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

在多线程访问情况下,我相信。如果不缓存引用,其他线程可以在保护之后但在触发之前将其清空。

如果您有多个线程并发修改Land

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

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

参见:c#事件和线程安全