2012-12-23 45 views
4

我相信如果标题是解释性的,但我需要一些帮助来理解这个概念。值类型是否有Type对象?

我们有与类型对象关联的方法表的类(引用类型)。 除了方法表之外,类型对象还包含所有的静态字段,类型为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” 的方法?

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

我确定参考类型的情况,但值类型混淆。

谢谢。

回答

0

方法不支持多态(除了从对象继承的方法,这取决于他们是否已经重写了执行不同):呼叫是一个静态的呼叫(而不是虚拟呼叫)。基本上,调用信息的“什么方法”部分由编译器解决并烧录到IL中。这就是JIT的工作,将该调用连接到最终的方法代码。

值类型上没有对象头等。

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

+0

先生纠正我,如果我错了 - >值类型的方法不支持多态性,因为值类型是密封的,不能从派生。因此,CLR的虚拟方法被CLR知道是非实际的,因为它知道该方法是在值类型上调用的。但是它由结构本身定义的方法的IL呢?在运行时存储在哪里JIT会在结构的任何实例上调用方法时将它们转换为本地代码? – Dinesh

+0

@Dnsh作为汇编元数据中的IL:无非就是如此。调用指令只是简单地给所需的方法添加一个标记 - 它并没有内联 –

+0

@Dnsh同样,静态与封闭与多态之间的选择都是相互关联的 - 说哪个是原因,哪个后果很复杂 –

0

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

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

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

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

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

希望有所帮助。价值类型

+0

一个细节。对值类型调用'.GetType()'会通过装箱,因此它对'Nullable <>'具有“令人惊讶”的结果。具体地说'(新可空(42))。的GetType()'将得到Int32'的'类型没有可为空的包装,和'(新可空())。的GetType()'抛出一个'NullReferenceException'运行时。 –

相关问题