Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c语言中的事件处理程序_C#_C# 4.0_Programming Languages - Fatal编程技术网

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

C# c语言中的事件处理程序,c#,c#-4.0,programming-languages,C#,C# 4.0,Programming Languages,事件处理程序的最佳做法是: class Plane { public event EventHandler Land; protected void OnLand() { if ( null != Land ) { Land( this, null ); } } } 这真的有必要吗?在什么情况下temp与Land不同?我相信在多线程访问的情况下。如果您不缓存引用,另一个线程可以在您的保

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

class Plane 
{
    public event EventHandler Land;

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

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

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

如果在测试和提升之间,有多个线程同时修改
Land

,则最后一个处理程序将由另一个线程从列表中删除

事件的调用列表将在其更改时被复制,临时引用仍将保留原始列表


请参阅:

我看不到您订阅活动的位置。如果要尝试更新用户界面,您可能还需要检查是否需要调用。我很确定,由于EventHandler是一种引用类型,如果在null检查之后但在调用之前,Land为null,它仍然会抛出null referenceexception,这就是我的观点。将引用缓存为“temp”作为最佳实践,这样就不会发生这种情况,也不会引发异常。Temp继续指向内存中方法作用域的对象,因此调用Temp不会引发异常。抱歉。这不是我习惯于的方式。但是一个快速的scratch程序暴露了我的错误。不幸的是,除非你编辑你的答案,否则我无法逆转我的投票。+1还有一个微妙的区别:事件是不可变的,就像字符串一样。So
事件动作MyEvent;MyEvent+=()=>Console.WriteLine(“你好1”);var-temp=MyEvent;MyEvent+=()=>Console.WriteLine(“Hello 2”);温度()
将只打印
Hello 1
,因为temp有MyEvent的“旧”副本。
EventHandler temp = Land;
if ( null != temp ) 
{
    temp( this, null );
}