Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/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#_Event Handling - Fatal编程技术网

C# 为什么在此示例中再次引用事件处理程序?

C# 为什么在此示例中再次引用事件处理程序?,c#,event-handling,C#,Event Handling,下面是示例代码: 在ResholdReach上受保护的虚拟无效(ThresholdReacheEventArgs e) { EventHandler=ThresholdReached; if(处理程序!=null) { 处理者(本,e); } } 难道我们不能直接检查阈值到达是否为空吗?是的,您可以直接检查空 这种类型的编码有助于解决多线程问题。如果您检查thresholdReach是否为null,然后另一个线程将其设置为null,然后您尝试运行该处理程序,它将失败。不太可能,但如果您正在运行

下面是示例代码:

在ResholdReach上受保护的虚拟无效(ThresholdReacheEventArgs e)
{
EventHandler=ThresholdReached;
if(处理程序!=null)
{
处理者(本,e);
}
}

难道我们不能直接检查
阈值到达
是否为
吗?

是的,您可以直接检查空

这种类型的编码有助于解决多线程问题。如果您检查
thresholdReach
是否为null,然后另一个线程将其设置为null,然后您尝试运行该处理程序,它将失败。不太可能,但如果您正在运行多个线程,则可能

因此,在本例中,您首先获得
thresholdReach
的值,这样您就可以检查
null
并调用它,而不用担心其他线程在两次调用之间弄乱该值。如果您没有多线程问题,那么无论如何,直接检查null


在多线程是一个问题的各种情况下,您都会发现这种防御性编码。

是的,您可以直接检查null

这种类型的编码有助于解决多线程问题。如果您检查
thresholdReach
是否为null,然后另一个线程将其设置为null,然后您尝试运行该处理程序,它将失败。不太可能,但如果您正在运行多个线程,则可能

因此,在本例中,您首先获得
thresholdReach
的值,这样您就可以检查
null
并调用它,而不用担心其他线程在两次调用之间弄乱该值。如果您没有多线程问题,那么无论如何,直接检查null

在多线程是一个问题的所有场景中,您都会发现这种防御性编码

protected virtual void OnThresholdReached(ThresholdReachedEventArgs e)
{
    EventHandler<ThresholdReachedEventArgs> handler = ThresholdReached;

    if (handler != null)
    {
        handler(this, e);
    }
}