变量如何知道它实现的类型?

时间:2013-03-12 14:29:56

标签: c#

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

以下是一个例子:

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的机制是什么?

2 个答案:

答案 0 :(得分:8)

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

MSDN - Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects

enter image description here

答案 1 :(得分:4)

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

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

我在这里练习虚拟功能:

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

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