c# - 为什么要通过变量引用事件?

标签 c# events coding-style

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

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/

相关文章:

c++ - 在构造函数初始化列表中初始化成员数组(C++11 之前)

c# - 在 Windows Media Center 中使用 keySend

PHPStorm 禁用匿名函数括号前的空格

c# - 如何有选择地验证一些数据注释属性?

c++ - QGraphicsView 和 QGraphicsItem 同时捕获的鼠标事件如何处理?

Objective-c : addTarget to UIButton not calling

c# - KeyDown、KeyUp 和 KeyPressed 不会在托管 WPF 控件的 WinForms 应用程序上触发

c++ - 编码风格 - 在 NULL 检查内部 if 条件后在指针上调用方法

c# - 实现读取器/写入器 - 航空公司预订示例

c# - 创建一个类来与 SQL 数据库交互