为什么通过变量引用事件?

wal*_*pus 4 c# events coding-style

我一直在其他人的代码中看到这种调用事件的模式:

void OnMyEvent()
{
  var myEvent = MyEvent;

  if (myEvent != null)
    myEvent(this, EventArgs.Empty);
}
Run Code Online (Sandbox Code Playgroud)

使用变量来引用事件有什么好处MyEvent,而不是直接使用MyEvent(this, EventArgs.Empty)

Ode*_*ded 8

在多线程应用程序中,事件可能会在此方法的调用过程中取消订阅.

这可能导致NullReferenceExceptionif不以这种方式复制事件处理程序.

void OnMyEvent()
{
  if (MyEvent!= null)                // Thread A checks event 
  {                                  // Thread B unsubscribes _last_ handler 
    MyEvent(this, EventArgs.Empty);  // Boom!
  }
}
Run Code Online (Sandbox Code Playgroud)

但是:

void OnMyEvent()
{
  var myEvent = MyEvent;             // Thread A gets _copy_ of invocation list
  if (myEvent != null)               // Using copy, so no problem 
  {                                  // Thread B unsubscribes _last_ handler
    myEvent(this, EventArgs.Empty);  // Still using copy, so no problem 
  }
}
Run Code Online (Sandbox Code Playgroud)