运行时中的类型

任何对象或值都是一个Type的实例。实例和Type的联系是不言明的。比如说,申明一个System.Int32 Type的变量或字段,产生一个内存块,它和Type的联系出现在操作它的执行代码的功效上。编译器将强制这种联系,CLR的检查器在代码加载后维护这联系。

因为对象是通过对象的引用来访问的,很可能实际的引用对象可能不匹配引用的申明Type,尤其是当引用对象是抽象对象时。很明显,需要某种机制来把对象和它的Type联系起来。

CRL中的每个对象都是以固定大小的对象头开始的。

虽然对象头不能用代码来访问,但是依然存在。(对象头的详细格式没有规范的文档)下面是对CLR 1.0的以经验为主32位系统的分析。

对象头有两个字段。第一个字段是sync block 索引,用来建立附加资源和这个对象的联系。第二个字段是代表对象的Type的不透明的数据结构的handler。在目前的CLR的实现中,对象的引用通常指向对象头的Type handle字段。第一个用户定义的字段几乎就是sizeof(void*),它不在对象引用的指向的范围内。

一个给定Type的每个实例拥有相同的Type handle值在他们的对象头。Type  handle几乎就是一个指针,指向包含这个Type完整描述的不言明的数据结构,它包含一个指针指向内存中 Type的原数据。该数据结构的内容是被优化的。

该数据结构的第一个应用是动态类型强制。

为了支持向下转换和边转换,CIL定义两种操作码:isinst和castclass。

 

posted @ 2012-02-15 18:55  szjdw  阅读(149)  评论(0编辑  收藏  举报