我只是浏览并遇到了这个问题:
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/