值类型是否具有Type对象?

时间:2012-12-23 16:36:12

标签: c# .net clr

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

我们有类(引用类型),它具有与Type对象关联的方法表。 除了方法表之外,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?

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

我确定参考类型的情况,但对值类型感到困惑。

感谢。

2 个答案:

答案 0 :(得分:0)

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

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

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

对于非结构化,非虚拟方法的调度与结构类本质相同。

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

希望有所帮助。

答案 1 :(得分:0)

值类型的方法不支持多态(除了从对象继承的方法,根据它们是否被覆盖而执行的方式不同):调用是静态调用(不是虚拟调用)。基本上,调用信息的“什么方法”部分由编译器解析并烧入IL。然后,JIT将该调用连接到最终方法代码。

值类型上没有对象标题等。

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