据我所知,每个变量都知道它的运行时类型。
以下是一个例子:
void Main()
{
C c = new C();
c.M();
I i = (I)c;
i.M();
}
public interface I
{
void M();
}
public class C : I
{
void I.M()
{
Console.WriteLine("I.M");
}
public void M()
{
Console.WriteLine("M");
}
}
如果我理解正确,i
仍然知道其类型为C
。那么,让i
决定使用I.M
代替M
的机制是什么?
答案 0 :(得分:8)
在内部,每个对象都有自己的TypeHandle,请参阅下面的对象内部结构:
MSDN - Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects
答案 1 :(得分:4)
您想知道运行时方法绑定是如何工作的,也就是说,当编译时没有足够的信息编码到程序中时,运行时如何知道调用一个方法M而不是另一个方法究竟是哪种方法来调用?
这是一个很好的练习:尝试编写一个具有该行为的程序,而不使用已在运行时中编写的功能。通过这样做,您将深入了解实现运行时的人员是如何做到的。
我在这里练习虚拟功能:
阅读该系列文章,您将看到如何使用没有该语言的语言模拟虚拟调度。我在文章中展示的基本思想或多或少是虚拟调度在C#中的实际工作方式。接口调度在实践中有点棘手,但概念基本相同。