考虑到 C# 是为了最大性能而编写的,我们可以通过两种方式拥有基类方法(注意:我们这里讨论的是无状态类,没有字段,只有方法):
我喜欢选项A,因为它使关系更加清晰。我想知道的是,如果所有这些基类方法都是非虚拟的,即在基类 A 中它们已经不能被覆盖,是否有 vtable 调用?显然,“非虚拟”意味着没有,但如果有任何开销,我想知道。
根据@HansPassant(非常感谢),
即使是对实例方法的非虚拟调用也是使用精确的 相当于虚拟调用。放弃一点性能以获得非常好的效果 保证,调用站点始终会引发 NullReferenceException。 当它为空时诊断 NRE 是相当难看的。
只有对静态方法的调用才是非虚拟的。顺便说一句,这包括扩展方法。
更新
在此 JIT 部分中搜索“去虚拟化”,了解从 .NET 6 开始可用的改进: https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-6/#jit
另请参阅
密封类真的能带来性能优势吗?
和
https://stackoverflow.com/a/53785972/19497610