2011-05-08 98 views
12

哪个更快;使用event.Invoke(args),或只是致电event(args)。有什么不同?一个比另一个更快或更慢;还是只是一个偏好问题?event.Invoke(args)vs event(args)。哪个更快?

+1

你自己尝试一下?分析它并查看哪个更好? – 2011-05-08 14:41:40

+0

只有少数几个客户似乎没有什么区别,但我关心的是当我扩大规模时会发生什么。在我们的新产品发布之前,我必须做出决定,一台计算机可能会一次处理数千个网络连接。 – IDWMaster 2011-05-08 14:43:35

+0

如果有人能够解释这两种方法的实施方式有什么不同,那就太好了。 – IDWMaster 2011-05-08 14:45:09

回答

35

写作someDelegate(...)someDelegate.Invoke(...)编译器的简写。
他们都编到同IL —一个callvirt指令到委托类型的Invoke方法。由编译器为每个具体委托类型产生

Invoke方法。

相比之下,基于Delegate类型定义的DynamicInvoke方法使用反射来调用委托并且速度很慢。

9

当你调用event(args),C#编译器把它变成一个IL呼吁event.Invoke(args)。这是一样的 - 就像使用stringSystem.String

6

这两种方式最终产生完全相同的IL相同,所以不称他们为任何区别。

话虽这么说,如果你有性能问题,这样的变化可能不会帮助你多少,如果在所有。如果你没有性能问题,那么就没有理由提出这样的问题。

2

由于在C#6.0中引入null-conditionals,Invoke可用于简化代表的线程安全空值检查。您先前将不得不做一些像

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

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

event?.Invoke(args)