C# 调用(args)与事件(args)。哪个更快?

C# 调用(args)与事件(args)。哪个更快?,c#,.net,C#,.net,哪个更快;使用event.Invoke(args),或者只调用event(args)。有什么区别?一个比另一个快还是慢;或者这只是一个偏好问题?编写someDelegate(…)是someDelegate.Invoke(…)的编译器速记 它们都编译成相同的IL-acallvirt指令,用于该委托类型的Invoke方法 Invoke方法由编译器为每个具体的委托类型生成 相反,在基本的委托类型上定义的DynamicInvoke方法使用反射来调用委托,速度很慢。当调用事件(args)时,C编译器将其转

哪个更快;使用
event.Invoke(args)
,或者只调用
event(args)
。有什么区别?一个比另一个快还是慢;或者这只是一个偏好问题?

编写
someDelegate(…)
someDelegate.Invoke(…)
的编译器速记
它们都编译成相同的IL-a
callvirt
指令,用于该委托类型的
Invoke
方法

Invoke
方法由编译器为每个具体的委托类型生成


相反,在基本的
委托
类型上定义的
DynamicInvoke
方法使用反射来调用委托,速度很慢。

当调用
事件(args)
时,C编译器将其转换为
事件.调用(args)
的IL调用。这是一样的-就像使用
string
System.string

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

这就是说,如果您有性能问题,像这样的更改可能不会对您有多大帮助(如果有的话)。

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

var handler = event;
if (handler != null)
    handler(args);
?。
调用的组合允许您简单地编写

event?.Invoke(args)

你自己试过吗?对它进行分析,看看哪一个表现更好?当它只是少数几个客户时,似乎没有什么区别,但我担心当我扩大规模时会发生什么。当一台计算机可能同时处理数千个网络连接时,我必须在将其发布到我们的新产品之前做出决定。如果有人能解释这两种方法的实现方式有什么不同,那就太好了。