基类中的非虚拟C#方法是否仍会产生可维护的开销?

时间:2018-04-16 12:33:21

标签: c# performance static instance vtable

考虑到为最大性能而编写的C#,有两种方法可以使用基类方法(注意:我们在这里讨论无状态类,没有字段,只有方法):

  • 实例类A为类B提供了继承/扩展的基础 - 通常的模式
  • 静态类A,静态方法(纯函数)静态调用"扩展器" B级

我喜欢选项A,因为它使关系更清晰。我想知道的是,如果所有这些基类方法都是非虚拟的,即在基类A中它们已经无法被覆盖,那么是否存在vtable调用?显然,"非虚拟"暗示没有,但如果有任何管理费用,我想知道。

1 个答案:

答案 0 :(得分:1)

根据@HansPassant(非常感谢),

  

即使对实例方法的非虚拟调用也是精确的   相当于一个虚拟的电话。为一个非常好的放弃一点性能   保证,始终在调用站点引发NullReferenceException。   当Null为空时诊断NRE非常难看。

     

只有对静态方法的调用才是非虚拟的。这包括扩展方法btw。