通用型别系统
該標準指定如何在計算機內存中表示類型定義和類型的特定值
通用型别系统 (Common Type System) 定义了执行期引擎如何使用程式中的资料型别,以及如何配置资料在记忆体中的一种标准,依照此种标准所撰写的程式语言,都可以在同一个执行期引擎中使用,因此它是跨语言支援的重要部份,亦即符合 CTS 规范的程式语言所撰写出的程式,都可以在 CLR 中使用。
CTS与CLI规格都是由微软所发展,目前已标准化为 ECMA 335 标准:“Common Language Infrastructure (CLI) Partitions I to VI.”,并且由 Microsoft 在 .NET Framework 中完全的实作。
CTS 的功能
- 建立一个可协助跨语言整合、型别安全与程式码的高效能执行的框架规范。
- 提供可在许多程式语言中完全实作的物件导向模型。
- 定义程式语言必须遵行,以帮助在不同的程式语言中所实作的物件能够与其他程式语言互动的规则。
- CTS 也定义了确保由不同程式语言所定义的资料类型能与其他程式语言互动的规则。
CTS 的类型
CTS 定义了两种类型:
实值型别 (Value-type)
- 实值型别直接包含资料,而且实值型别的执行个体 (Instance) 不是在堆叠上配置,就是在结构中内嵌 (Inline) 配置。实值型别可为内建 (由执行阶段实作)、使用者定义或列举型别 (Enumeration)。
参考型别 (Reference-type)
- 储存变数记忆体位址的参考,并且在堆积 (Heap) 上配置。参考型别可为自我描述型别、指标型别 (Pointer Type) 或介面型别 (Interface Type)。参考型别的型别可从自我描述型别的值判断出来。自我描述型别可再分为阵列和类别型别。类别型别包括使用者定义型别、Boxed 实值型别和委派。
Boxing 与 Unboxing
Boxing
所谓的打包 (Boxing),是指将实值型别转换成参考型别的一种机制,如下列程式码所示,程式并不一定要明确的告知编译器要将实值型别转换成参考,它自己会处理这个部份。
Int32 x = 10;
object o = x ; // 隱含打包
Console.WriteLine("The Object o = {0}",o); // prints out 10
然而,一个 Int32 变数总能够使用类似下列的方式来外显打包:
Int32 x = 10;
object o = (object) x; // 外顯打包(明確指定)
Console.WriteLine("The object o = {0}",o); // prints out 10
Unboxing
所谓的解包 (Unboxing),是指将参考型别反转回实值型别,如下列程式所示。
Int32 x = 5;
object o = x; // 隱含打包
x = o; // 隱含解包