快照';将事件处理程序值作为C#中的方法参数

本文关键字:参数 方法 程序 事件处理 快照 | 更新日期: 2023-09-27 18:20:58

根据这个问题(以及其他问题),有一个在调用之前对事件处理程序值进行快照的示例:

var tmp = _myEventHandler;
if(tmp != null) {
    tmp(sender, args);
}

然而,如果我将事件处理程序和args传递到一个函数中,这会做同样的事情吗?

protected void Invoke(MyEventHandler handler, MyEventArgs args)
{
    if (handler != null)
        handler(this, args);
}

我会说是的,但经过思考,我不知道它是否相同——比如优化过程可以内联这个函数并删除快照变量吗?

快照';将事件处理程序值作为C#中的方法参数

它确实做了同样的事情。代码只是检查事件处理程序是否为非null,因此是否可用于引发。对于字段/参数/本地,此代码没有什么不同。C#编译器或JITer不能以删除临时的方式内联它,因为它会改变程序的语义。

比赛条件在您的其他链接中进行了解释,例如Marc Gravell的回答。

正如@JaredPar所指出的,您的代码有效地做了同样的事情。然而,它违反了.NET的标准事件约定,后者建议使用以下内容:

protected virtual void OnAlarmRaised(AlarmRaisedEventArgs e)

您可以自由地违反该模式,但这样做违背了最低限度(如果有的话)的利益。