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);
}
}