4

据我所知,每个变量都知道它的运行时类型。

这是一个例子:

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什么?

4

2 回答 2

8

每个对象内部都有自己的 TypeHandle,请参见下面的对象内部结构:

MSDN - 深入了解 .NET Framework 内部结构以了解 CLR 如何创建运行时对象

在此处输入图像描述

于 2013-03-12T14:36:51.950 回答
4

你想知道运行时方法绑定是如何工作的,也就是说,当编译时没有足够的信息来精确地编码到程序中调用哪个方法时,运行时如何知道调用一个方法 M 而不是另一个?

这是一个很好的练习:尝试编写一个具有该行为的程序,而不使用该功能,因为它已经在运行时编写。通过这样做,您将深入了解实现运行时的人员是如何做到的。

我在这里完成了虚拟功能的练习:

http://blogs.msdn.com/b/ericlippert/archive/2011/03/17/implementing-the-virtual-method-pattern-in-c-part-one.aspx

阅读该系列文章,您将了解如何在没有虚拟调度的语言中模拟虚拟调度。我在文章中展示的基本思想或多或少是虚拟调度在 C# 中的实际工作方式。接口调度在实践中有点棘手,但概念基本相同。

于 2013-03-12T14:48:26.777 回答