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

Mr.*_*ith 1 .net c# cil

摘自Eric Gunnerson的博客" 虚拟函数没有内联 ",但什么才有资格作为虚拟方法?MSDN将其定义为:

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

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

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

svi*_*ick 5

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

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

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

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

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