首页 理论教育 通用类型系统:应用类型和值类型

通用类型系统:应用类型和值类型

时间:2023-11-20 理论教育 版权反馈
【摘要】:通用语言运行时的一个重要的组成部分就是通用类型系统。通过这个支持,虽然每种编程语言都有自己独特的类型系统,但编译以后都会转换成CTS类型,此时就可以实现不同语言编写的程序之间的互操作。CTS的类型主要分为两类:应用类型和值类型。图1-2通用类型系统值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在堆中。

通用类型系统:应用类型和值类型

通用语言运行时的一个重要的组成部分就是通用类型系统(Common Type System, CTS)。CTS定义了一个类型库,把各种不同类型的语言进行了抽象,产生了通用类型,为.NET平台上的各种编程语言提供支持。通过这个支持,虽然每种编程语言都有自己独特的类型系统,但编译以后都会转换成CTS类型,此时就可以实现不同语言编写的程序之间的互操作。从这个意义上讲,.NET是跨平台、跨语言的编程架构

CTS的类型主要分为两类(见图1-2):应用类型和值类型。两种类型之间可以相互转换,转换的方法就是装箱(Boxing)和拆箱(Unboxing)。CTS类型不是引用类型就是值类型,引用类型和值类型都继承自Object对象,具体的值类型又继承自ValueType对象。

图1-2 通用类型系统(www.xing528.com)

值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在堆中。例如String、Class、Interface等就是引用类型,而Char、Int32、Boolean等都是值类型。对于引用类型而言,由于数据存储在堆中,指向它的引用可能不止一个,因此当其他引用对数据进行修改时会影响到别的引用。

在托管代码中,CTS为每种类型分配内存的方式只有两种:分配在托管栈(Stack)中;分配在托管堆中(Heap)。内存的分配是由公共运行时(CLR)管理的。分配在托管栈中的变量会在创建它们的方法返回时自动释放,而分配在托管堆中的变量则不会,它们所占用的内存由垃圾回收(GC)机制释放。例如某个String类型的变量Name,它指向托管堆中的数据“Hello world!”,当方法调用结束的时候,Name在托管栈上占用的内存会立即释放,但它在托管堆上指向的数据“Hello world!”还会依然存在,只不过此时可能没有变量引用指向它了,它将持续等待直到未来某个时候被GC回收并释放所占内存。GC的执行是不可预期的,但是可以通过调用System.GC.Collect()强制执行垃圾回收。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈