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调用。 这是一回事 – 比如使用stringSystem.String

两种方式最终都会生成完全相同的IL,因此调用它们没有任何区别。

话虽这么说,如果你遇到性能问题,这样的改变对你来说可能不会有太大帮助,如果有的话。 如果您没有性能问题,那么根本没有理由提出这样的问题。

自从在C#6.0中引入null-conditionals以来, Invoke可用于简化委托的线程安全空值检查。 以前你必须做的事情

 var handler = event; if (handler != null) handler(args); 

?.的组合?.Invoke允许你简单地写

 event?.Invoke(args)