覆盖方法是否被视为虚拟方法?

时间:2013-02-11 23:47:33

标签: c# .net cil

取自Eric Gunnerson的博客“virtual functions are not inlined”,但什么才有资格作为虚拟方法? MSDN将其定义为:

  

“当实例方法声明包含虚拟修饰符时,该方法被称为虚方法。当不存在虚拟修饰符时,该方法被称为非虚方法。” - MSDN Source

严格地说,使用覆盖方法public override void SomeMethod(){}“的派生类不包含单词virtual,那么它可以内联吗?

编辑:具体来说,问题是覆盖的方法是否是内联的候选方法,因为我提供的两个链接在覆盖方法上过于模糊。

2 个答案:

答案 0 :(得分:5)

来自§1.6.6.4C#4.0规范的虚拟,覆盖和抽象方法(引用旧版本):

  

虚拟方法可以在派生类中重写。当实例方法声明包含override修饰符时,该方法将覆盖具有相同签名的继承虚拟方法。虚拟方法声明引入新方法时,覆盖方法声明通过提供该方法的新实现来专门化现有的继承虚拟方法。

因此,当您编写override方法时,您实际上并没有创建新方法,而只是覆盖了一个方法。那个必须是virtual,所以你实际调用的方法是虚拟的。

话虽如此,有些情况可以内联虚拟方法:如果有问题的对象的编译时类型是sealed,那么毫无疑问要执行什么代码。 (我相信.Net实际上使用此优化。)

但在其他情况下,虚拟方法无法内联。

答案 1 :(得分:0)

覆盖虚拟方法的方法肯定是虚拟的。在许多方面,它们都是与它们覆盖的方法相同的方法。他们使用一种叫做vtable的东西。他们引用的博客指出,编译器会优化它的功能,但由于虚拟/重写方法涉及查找,因此无法简化。