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)
我会说是的,但在考虑之后我不知道它是否相同 - 就像优化过程内联这个函数并删除快照变量一样?
它确实做了同样的事情.代码只是检查事件处理程序是否为空,因此可用于提升.对于字段/参数/ local,此代码没有区别.C#编译器或JITer不能以删除临时的方式内联它,因为它会改变程序的语义.