为什么在调用之前为事件分配处理程序?

基本上,我已经看到这经常使用:

public event MyEventHandler MyEvent; private void SomeFunction() { MyEventHandler handler = this.MyEvent; if (handler != null) { handler(this, new MyEventArgs()); } } 

什么时候可以像这样容易地做到:

  public event MyEventHandler MyEvent; private void SomeFunction() { if (MyEvent != null) { MyEvent(this, new MyEventArgs()); } } 

那么,我错过了什么吗? 是否有人将事件分配给处理程序,然后引发处理程序而不是事件本身? 这只是“最佳实践”吗?

对局部变量的赋值可确保如果事件在if和实际调用之间取消注册,则调用列表将不为null(因为该变量将具有原始调用列表的副本 )。

这在multithreading代码中很容易发生,在检查null和触发事件之间,它可能被另一个线程取消注册。

看到这个问题和答案。

线程安全。

如果在您检查MyEvent是否为空并且触发MyEvent之间发生了什么,另一个线程出现并取消订阅该事件?