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

时间:2012-01-22 15:56:27

标签: c# events delegates

从这个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);
}

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

竞争条件会在您的其他链接中解释,例如Marc Gravell's answer

正如@JaredPar指出的那样,你的代码有效地做了同样的事情。但是,它违反了.NET的标准事件约定,它推荐以下内容:

protected virtual void OnAlarmRaised(AlarmRaisedEventArgs e)

你可以自由地违反这种模式,但这样做会对最小化(如果有的话)的好处产生影响。