技术开发 频道

从微软CLR视角看.net用户自定义类型


【IT168 技术文档】 这篇文章包括与微软CLR 2.0(下面称为CLR)里不同类型(值类型,引用类型,委托类型等等)的操作相关的技术信息。通过在VS.NET 2005 和 C# 编译器中使用Son Of Strike (SOS)调试扩展名,我做了大量的研究和分析,这篇文章中的理论都是建立的我的分析及.NET类型行为的研究之上的。在不同的MSDN博客,MSDN文章以及MSDN书籍中也都讨论了这些概念。然而,这些形式都包含在一个更广泛的主题内,很难找到在更好的,重要的知识点。我的这篇文章给人们提供了单一的引用,它是与类型的内部工作方式相关,是一些更好的重要的知识点。

    这篇文章假设读者非常了解.NET里不同类型分类的工作方式。同时这篇文章没有讨论怎样建立和使用不同的类型分类,而主要描写了检查CLR里不同类型分类的不同方面的操作细节。开始我只是将这些内容作为引用文件,但是想把它作文一篇文章发表,可能对.NET集体有益。我非常高兴能收到大家的评论,指出文章的不足来改进这篇文章内容。

    在.NET里有两个主要的类型分类,每一个类型都(直接或间接的通过一个基底类型)从一个叫做系统.对象的根引用类型派生出来。

• 值类型
o 用户自定义值类型
o 枚举类型
• 引用类型
o 用户自定义类型
o 数组类型
o 委托类型

    除了这些类型的实例是否是分配在迭式存储器上还是分配在器堆上的一些简单区别外,在定义,行为以及这些类型的实例中也存在核心的内在的设计差别。编译器和CLR一起在值类型 和引用类型的编译时间和执行时创建并保持了区别。了解CLR是怎样执行这些类型,以及怎样与这些类型一起工作将允许开发者设计更好的.NET应用程序。
 
用户自定义类型(值类型 和引用类型)

存储单元

    值类型分配在迭式存储器上。主要为类型(这些类型代表基础的数据项目)减少垃圾回收机制上的冲突就能完成这一分配。因为重的分配,垃圾回收循环以及动态的记忆而产生了这个冲突。而且重的分配,垃圾回收循环以及动态都需要被OS.要求。这样也就使得人们能接受使用值类型的性能,并使这一性能有效。引用类型安置在垃圾回收器堆上。

存储配置

    值类型实例仅仅包括它范围内的值。然而引用类型的实例包括额外设备来处理垃圾回收, 同步, 应用程序域证明和类型信息。这个额外的设备给每一个引用类型实例都增加了8字节。这个被提到的值类型实例的变量代表被分配在迭式存储器上的值类型实例的起始地址。代表值类型本地变量的地址被命名为托管指针,通常用于迭式存储器上的参引参数。

    代表引用类型实例的变量被称为对象引用,引用类型实例的变量是引用类型实例+ 4字节起始地址的指针。任何引用类型实例的起始地址是一个4字节值,被称为同步字组地址,它指向process-wide表格里的位置,此process-wide表格包含用来同步访问引用类型实例的结构。下面的4字节包括存储器(特殊的应用程序域)地址,此存储器包括一个结构,结构中包含有此对象实例化或指向的引用类型的方法表。这个方法表中又有一个其他结构的引用,这个引用为相对应引用类型保持执行时类型信息。

    在他们的实例中,类型中的方法表中出现指针使得引用类型成为自描述类型。电脑程序和CLR可以发现关于引用类型实例的信息,也可以用于多个执行时设备中,例如:类型转换,多型,反射等等。另一方面,因为值类型实例在他们实例中缺乏类型方法表,只是储存了大量的记忆,而没有给人们留下任何线索,告诉人们这个储存的到底是什么。正因为这个原因,值类型不是自描述类型。

0
相关文章