1

摘自 Eric Gunnerson 的博客“ virtual functions are not inlined ”,但什么才算是虚方法呢?MSDN 将其定义为:

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

严格来说,一个带有override方法的派生类public override void SomeMethod(){}“不包含”这个词virtual,可以内联吗?

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

4

2 回答 2

5

从 C# 4.0 规范的 §1.6.6.4 Virtual、override 和 abstract 方法(您引用的是旧版本):

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

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

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

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

于 2013-02-11T23:56:36.980 回答
0

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

于 2013-02-12T00:00:42.317 回答