我在微软实践测试中遇到过这个问题,我感到很困惑。这是一个问题:
以下哪个C#代码示例 是举办活动的正确方式, 假设报警事件, AlarmEventArgs类,和 AlarmEventHandler委托已经 声明?
以下是他们提供的“正确”答案:
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);
}
我个人总是使用第二种方法。它工作得很好。有人可以告诉我为什么我应该使用第一种方法而不是第二种方法吗?
答案 0 :(得分:14)
答案 1 :(得分:7)
在多线程环境中,可能会在调度事件时更新事件处理程序。要避免这种情况,请在检查null并分派消息之前将处理程序分配给局部变量。