[英]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.