为什么C#没有非虚拟调用约定?

时间:2010-07-31 14:42:51

标签: c# language-design

灵感来自this SO question

为什么C#没有非虚拟调用约定的关键字?

编辑:我的意思是“为什么没有非虚拟IL调用的关键字,因为C#编译器默认使用IL虚拟调用”?

2 个答案:

答案 0 :(得分:3)

查看why c# implements methods as non-virtual by default?

引用Anders Hejlsberg

  

有几个原因。一个是   性能。我们可以观察到这一点   人们用Java编写代码,他们忘了   最终标记他们的方法。   因此,这些方法是虚拟的。   因为它们是虚拟的,所以它们不是   表现也很好。只是   与...相关的性能开销   是一种虚拟方法。那是一个   问题。

     

更重要的问题是版本控制。   有两种思想流派   虚拟方法。学院   思想说:“一切都应该如此   虚拟,因为我可能想要   有一天会超越它。“务实   思想学派,来自   构建运行的实际应用程序   现实世界说,“我们必须成为现实世界   真正小心我们的所作所为   虚拟“。

     

当我们制作虚拟的东西时   平台,我们做了很多   关于它如何演变的承诺   未来。对于非虚方法,我们   承诺,当你打电话给这个   方法,x和y会发生。什么时候我们   我们在API中发布虚拟方法   不仅在你打电话时承诺   这种方法,x和y会发生。我们   当你覆盖时也承诺   这个方法,我们将在此调用它   关于的特定顺序   这些其他的和国家将是   在这个和那个不变的。

     

每当你在API中说虚拟时,   你正在创建一个回拨钩子。如   OS或API框架设计器,   你必须要真正小心   那。您不希望用户覆盖   并在任何任意点挂钩   一个API,因为你不一定   做出这些承诺。人们可能会   不完全明白他们的承诺   正在制作什么东西   虚拟

来源:http://www.artima.com/intv/nonvirtual.html

答案 1 :(得分:2)

这可以解释一下:http://blogs.msdn.com/b/ericgu/archive/2008/07/02/why-does-c-always-use-callvirt.aspx

很快:call指令可以接受null作为this指针(就像在C ++中一样)。这是错误的,C#团队决定尽可能使用callvirt,以便对null指针的调用抛出NullReferenceException