Do值类型有类型的对象?(Do value types have Type objects?)

2019-07-17 12:57发布

我相信,如果标题是explainatory与否,但我需要一些帮助理解概念。

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

CLR调用引用类型的实例方法时指该方法表。

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

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

在运行时,当一个方法被称为上的值类型,从哪里的CLR参见方法的IL被称为上的值类型的实例。

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

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

哪里CLR是指发现IL名为“MethodOnValueType”的方法?

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

我相信,对于引用类型的案件,但迷糊值类型。

谢谢。

Answer 1:

对价值类型的方法不支持多态(除了从对象继承的方法,这取决于他们是否已经重写了执行不同):呼叫是一个静态的呼叫(而不是虚拟呼叫)。 基本上,呼叫信息的“什么方法”部分是由编译器解析并烧入IL。 它是那么JIT的工作向呼叫连接到最后一个方法的代码。

有上一个值类型没有对象报头等等。

你可以得到的值类型的Type对象,但并没有真正涉及到的方法调用。



Answer 2:

值类型有Type的对象,就像类做。

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

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

调度到非虚拟方法基本上是结构相同的,因为它是类。

虚拟方法涉及在V型表,这是引用类型的属性查找。 如果声明一个结构定义的接口,然后经由该接口调用它,它会自动盒装入引用类型,使得此虚拟构件可被调用。

希望可以帮助一些。



文章来源: Do value types have Type objects?
标签: c# .net clr