第8章 基本类型和签名

基本类型就那么几种,都在表8-1中列出了。此外,还提到了数据指针类型和函数指针类型。

CLR中有两种类型的数组——向量和多维数组。它们的创建方式不同,从而布局也不同。

以上都是炒“冷饭”,学过一点C#都多少知道一点,而修饰符才是一个有趣的特性。4种修饰符各有用途:

修饰符modreq和modopt,用于托管/非托管封送的返回类型或方法参数上。在将非托管方法封送为托管方法时尤其有用,从而区分在C++中不同但在CLR中相同的类型,如C++中的int和long,都对应CLR中的E_T_I4。

修饰符Sentinel,也就是...,也就是vararg方法中可选参数和固定参数的中间分隔符号。

修饰符pinned只适用于方法的局部变量,一旦指定,该变量不会进行垃圾收集。

由CLR识别的非托管类型,又称为“本地的”(native),位于CorHdr.h的枚举CorNativeType中。其中,值得一提的是N_T_ARRAY的参数<sizes>。

 

在签名中的类型引用,有CLASS和VALUETYPE,还有OBJECT和STRING。

 

终于说到签名了。篇幅不大,但极其精辟。

像字段、方法和局部变量这样的程序项,并不是直接使用编码类型来描述的;而是通过签名来描述的。签名是包括一个或多个编码类型的字节数组,驻留在元数据的#Blob流中。

使用签名的元数据表有:Field表、Method表、Property表、MemberRef表、StandAloneSig表(间接调用签名)、TypeSpec表(局部变量签名)。

签名的第一个字节标识了这个签名的类型,出于历史原因,称为签名的调用约定。

 

第11章 泛型类型

在CLR 1.1的时代,就已经在IL中为泛型预留出了位置,这使得从.CLR 1.1升级为2.0极其简单——只是增加了几个元数据表。我们可以将其想象为抽象工厂模式,以添加一个维度的方式,达到翻倍的效果。

T^1这样的符号是多么的神奇,以至于我们不需要学太多的新东西。所以非泛型的技术,在泛型中仍然适用。

CLR不会再有太大的改动了,高级语言的那些语法糖只是在编译器上做文章。