为什么在此示例中对事件处理程序进行另一个引用?

时间:2014-05-09 20:26:26

标签: c# event-handling

以下是示例代码:http://msdn.microsoft.com/en-us/library/system.eventhandler.aspx

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

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

我们不能直接检查ThresholdReachednull吗?

1 个答案:

答案 0 :(得分:4)

是的,你可以直接检查null。

这种编码风格有助于解决多线程问题。如果检查ThresholdReached是否为空,然后另一个线程使其为空,然后您尝试运行处理程序,则它将失败。不太可能,但如果您运行多个线程,则可能。

因此,在此示例中,您首先获得ThresholdReached的值,以便检查null 调用它,而不必担心其他线程会混淆两次通话之间的价值。如果您没有多线程问题,那么请务必直接检查null。

你会在各种多线程出现问题的场景中找到这种防御性编码。