5

我确定标题是否具有解释性,但我需要一些帮助来理解这个概念。

我们有具有与 Type 对象关联的方法表的类(引用类型)。除了方法表之外,类型对象还包含所有静态字段、类型 obj 指针和同步块索引。

CLR 在对引用类型的实例调用方法时引用此方法表。

方法表包含用于更改实例字段状态的特定方法的 IL。

同样,我们可以为结构(值类型)定义方法。

在运行时,当在值类型上调用方法时,CLR 从哪里引用在值类型的实例上被调用的方法的 IL。

struct A
{
    // for Immutability of value type
    public readonly int a;

    public void MethodOnValueType()
    {
        // Some code here
    }
}

CLR 指的是在哪里找到名为“MethodOnValueType”的方法的 IL?

托管堆中的值类型是否有任何类型对象?

我确信引用类型的情况,但对值类型感到困惑。

谢谢。

4

2 回答 2

1

值类型有Type对象,就像类一样。

Type intType1 = typeof(int);
Type intType2 = 100.GetType();

Debug.Assert(ReferenceEquals(intType1, intType2));

对于结构和类,对非虚拟方法的分派本质上是相同的。

虚拟方法涉及在 v-tables 中查找,这是引用类型的属性。如果您声明一个定义接口的结构,然后通过该接口调用它,它将自动装箱为引用类型,以便可以调用此虚拟成员。

希望能有所帮助。

于 2012-12-23T16:46:28.593 回答
1

值类型上的方法不支持多态性(从对象继承的方法除外,这些方法的执行取决于它们是否被覆盖):调用是静态调用(不是虚拟调用)。基本上,调用信息的“什么方法”部分由编译器解析并烧录到IL中。然后,JIT 的工作就是将该调用连接到最终的方法代码。

值类型上没有对象头等。

您可以获得值类型的 Type 对象,但这与方法调用无关。

于 2012-12-23T16:59:53.780 回答