据我所知,使类sealed摆脱了在VTable中的查找,还是我错了?如果我将类设为sealed,这是否意味着类层次结构中的所有虚拟方法也都标记为sealed

例如:

public class A {
    protected virtual void M() { ........ }
    protected virtual void O() { ........ }
}

public sealed class B : A {
    // I guess I can make this private for sealed class
    private override void M() { ........ }
    // Is this method automatically sealed? In the meaning that it doesn't have to look in VTable and can be called directly?

    // Also what about O() can it be called directly too, without VTable?
}

最佳答案



您不能在继承层次结构中更改访问修饰符。这意味着如果方法在基类中是public,则不能在派生类中将其设置为privateinternalprotected。仅当您将方法声明为new时,才能更改修饰符:

private new void M() { ........ }



密封类在层次结构中排在最后,因为您不能从其继承。如果sealed类覆盖了基类中的某些方法,则虚拟表可以与sealed类一起使用。



您可以看到IL代码:
.method family hidebysig virtual            // method is not marked as sealed
    instance void M () cil managed
{
    .maxstack 8

    IL_0000: nop
    IL_0001: ret value
}

方法未标记为sealed。即使您将此方法明确标记为sealed,您也将获得相同的IL代码。

另外,没有理由在sealed类中将方法标记为sealed。如果class是sealed,则不能继承它,也不能继承它的方法。

关于虚拟表-如果方法被覆盖,并且您从虚拟表中将其删除,则您永远不能在继承层次结构中使用它,因此,没有理由要覆盖方法,也不要在继承层次结构中使用它。

10-07 15:31