gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:52:19 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com