c# - 事件处理程序引发方法约定

标签 c# coding-style delegates

我只是浏览并遇到了这个问题:

Action vs delegate event

The answer from nobug包括这段代码:

protected virtual void OnLeave(EmployeeEventArgs e) {
  var handler = Leave;
  if (handler != null)
    handler(this, e);
}

Resharper 在使用“创建提升方法”快速修复时也会生成类似的代码。

我的问题是,为什么这条线是必要的?:

var handler = Leave;

为什么它比写这个更好?:

protected virtual void OnLeave(EmployeeEventArgs e) {
  if (Leave != null)
    Leave(this, e);
}

最佳答案

它更好,因为 Leave 在 null 检查之后但在调用之前变为 null 的可能性很小(这会导致您的代码抛出 NullReferenceException)。由于委托(delegate)类型是不可变的,如果您首先将它分配给一个变量,这种可能性就会消失;您的本地副本不会受到分配后 Leave 的任何更改的影响。

请注意,这种方法反过来也会产生问题;这意味着有一种(微小但存在的)事件处理程序在与事件分离后被调用的可能性。这种情况当然也应该妥善处理。

关于c# - 事件处理程序引发方法约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2282894/

相关文章:

C#、XML、添加新节点

java - 变量声明 - 尽可能使用修饰符 'final'。是的,类和方法怎么了?

python - 冲突准则

.net - 是否有 System.Windows.SystemColors 的视觉指南?

ios - 将 UIScrollView 委托(delegate)设置为它自己的自定义类

c# - 内存泄漏和局部变量

c# - Unity Bootstrapper (Unity.Mvc), Unity 3, MVC 5, EF6 接收错误 : Parameterless Public Constructor on Controller

c# - 什么时候/为什么我应该使用 C#'s "WebPageExecutingBase.Href()"方法?

c# - 验证消息包含 '{PropertyName}' 而不是属性名称

ios - webservice调用的通用共享类