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

E.B*_*ach 1 c# events delegates

从这个问题(和其他人)中可以看到在调用之前为事件处理程序值创建快照的示例:

var tmp = _myEventHandler;
if(tmp != null) {
    tmp(sender, args);
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我将事件处理程序和args传递给函数,这会做同样的事情吗?

protected void Invoke(MyEventHandler handler, MyEventArgs args)
{
    if (handler != null)
        handler(this, args);
}
Run Code Online (Sandbox Code Playgroud)

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

Jar*_*Par 5

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