event.Invoke(args)vs event(args)。 哪个更快?
哪个更快; 使用event.Invoke(args)
,或只调用event(args)
。 有什么不同? 是一个比另一个更快或更慢; 或者只是一个偏好问题?
编写someDelegate(...)
是someDelegate(...)
的编译器简写。
它们都编译为相同的IL-a callvirt
指令到该委托类型的Invoke
方法。
Invoke
方法由编译器为每个具体委托类型生成。
相比之下,在基本Delegate
类型上定义的DynamicInvoke
方法使用reflection来调用委托并且速度很慢。
当您调用event(args)
,C#编译器将其转换为对event.Invoke(args)
的IL调用。 这是一回事 – 比如使用string
或System.String
。
两种方式最终都会生成完全相同的IL,因此调用它们没有任何区别。
话虽这么说,如果你遇到性能问题,这样的改变对你来说可能不会有太大帮助,如果有的话。 如果您没有性能问题,那么根本没有理由提出这样的问题。
自从在C#6.0中引入null-conditionals以来, Invoke
可用于简化委托的线程安全空值检查。 以前你必须做的事情
var handler = event; if (handler != null) handler(args);
?.
的组合?.
和Invoke
允许你简单地写
event?.Invoke(args)