从这个question(和others)开始,这个例子是在调用之前为事件处理程序值创建快照:
var tmp = _myEventHandler;
if(tmp != null) {
tmp(sender, args);
}
但是,如果我将事件处理程序和args传入函数,这会做同样的事情吗?
protected void Invoke(MyEventHandler handler, MyEventArgs args)
{
if (handler != null)
handler(this, args);
}
我会说是的,但在考虑之后我不知道它是否相同 - 就像优化过程可以内联这个函数并删除快照变量一样吗?
答案 0 :(得分:5)
确实做同样的事情。代码只是检查事件处理程序是否为空,因此可用于提升。对于字段/参数/ local,此代码没有区别。 C#编译器或JITer不能以删除临时的方式内联它,因为它会改变程序的语义。
答案 1 :(得分:0)
竞争条件会在您的其他链接中解释,例如Marc Gravell's answer。
正如@JaredPar指出的那样,你的代码有效地做了同样的事情。但是,它违反了.NET的标准事件约定,它推荐以下内容:
protected virtual void OnAlarmRaised(AlarmRaisedEventArgs e)
你可以自由地违反这种模式,但这样做会对最小化(如果有的话)的好处产生影响。