基本调用是否在c#中动态绑定?
出于好奇:在C#中使用基本调用是否在c#中动态绑定?,c#,polymorphism,dynamic-binding,C#,Polymorphism,Dynamic Binding,出于好奇:在C#中使用base关键字的调用是否动态绑定(即,它是多态调用) 考虑以下示例: public class A { public virtual void WriteSomething() { Console.WriteLine("Hello from A"); } } public class B : A { public override void WriteSomething() { base.W
base
关键字的调用是否动态绑定(即,它是多态调用)
考虑以下示例:
public class A
{
public virtual void WriteSomething()
{
Console.WriteLine("Hello from A");
}
}
public class B : A
{
public override void WriteSomething()
{
base.WriteSomething();
Console.WriteLine("Hello from B");
}
}
public class Program
{
public static void Main()
{
A instance = new B();
instance.WriteSomething();
}
}
我知道当客户端(在本例中是Main
方法)调用instance.writeMething
时,此调用是动态绑定的。但是类B
中重写的方法中的base.writeMething
调用呢?我假设它不是动态绑定的,因为编译器在编译时知道基类,因此动态绑定是不必要的——但是我找不到任何关于它的文档
提前谢谢你的帮助 我刚刚看了一下中间语言,可以看到
base
调用没有动态绑定(蓝色矩形):
是什么让你认为
instance.writeMething
是动态绑定的?这很容易出现无限递归,不是吗?如果一个基类和一个派生类都实现了f()
,并且派生类调用base.f()
并向它添加了一些东西,这是一种常见的模式,base.f()
实际上会再次调用f()
的最派生的实现(或者语义还会是什么?如果它总是调用最派生的实现,但只调用一个实现,则可以构造类似的场景)@Enigmativity,因为它被声明为虚拟的?@PeterSchneider:你说得对,那会导致无限递归。我还没想到呢。@PeterSchneider-我以为virtual
只是为了启用重写,编译器仍然硬编码调用。