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