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

void OnMyEvent()
{
  var myEvent = MyEvent;

  if (myEvent != null)
    myEvent(this, EventArgs.Empty);
}

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

最佳答案

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

如果未以这种方式复制事件处理程序,这可能会导致 NullReferenceException

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

但与:
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
  }
}

关于c# - 为什么要通过变量引用事件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12420934/

10-09 19:44