在C#中举起一个事件

我在微软实践测试中遇到了这个问题,我感到很困惑。 这是一个问题:

假设已声明了Alarm事件,AlarmEventArgs类和AlarmEventHandler委托,以下哪个C#代码示例是引发事件的正确方法?

以下是他们提供的“正确”答案:

AlarmEventArgs e = new AlarmEventArgs(1, 2); AlarmEventHandler handler = Alarm; if (handler != null) { handler(this, e); } 

但是,还有另一个看似正确的答案。

 AlarmEventArgs e = new AlarmEventArgs(1, 2); if (Alarm!= null) { Alarm (this, e); } 

我个人总是使用第二种方法。 它工作得很好。 有人可以告诉我为什么我应该使用第一种方法而不是第二种方法?

我问了一个类似的问题。 接受的答案是一个很好的解释。

在事件调度之前检查null …线程安全吗?

在multithreading环境中,可能会在调度事件时更新事件处理程序。 要避免这种情况,请在检查null并分派消息之前将处理程序分配给局部变量。