繁体   English   中英

在C#中将事件处理程序值快照为方法参数

[英]Snapshot'ing the event handler value as method argument in C#

在这个问题 (和其他 问题 )中,有一个在调用前快照事件处理程序值的示例:

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

但是,如果我将事件处理程序和args传入函数中,是否会执行相同的操作?

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

我会说是的,但是在考虑了这一点之后,我不知道它是否相同-像优化过程可以内联此函数并删除快照变量吗?

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

您的其他链接(例如Marc Gravell的答案 )中说明了比赛条件。

正如@JaredPar指出的那样,您的代码有效地完成了同样的事情。 但是,它违反了.NET的标准事件约定,因此建议采取以下措施:

protected virtual void OnAlarmRaised(AlarmRaisedEventArgs e)

您可以随意违反该模式,但是这样做会违背最小的利益(如果有)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM