本章内容
C#程序是一组类型声明
类型是一种模板
实例化类型
数据成员和函数成员
预定义类型
用户定义类型
栈和堆
值类型和引用类型
变量
静态类型和dynamic关键字
可空类型
值类型引用类型
数据项的类型定义了存储数据需要的内存大小及组成该类型的数据成员。类型还决定了对象
在内存中的存储位置一一栈或堆。
类型被分为两种:值类型和引用类型,这两种类型的对象在内存中的存储方式不同。
值类型只需要一段单独的内存,用于存储实际的数据。
引用类型需要两段内存。
以第一段存储实际的数据,它总是位于堆中。
鼠第二段是一个引用,指向数据在堆中的存放位置。
图4-9展示了每种类型的单个数据项是如何存储的。对于值类型,数据存放在栈里。对于引
用类型,实际数据存放在堆里而引用存放在栈里。
存储引用类型对象的成员
图4-9阐明了当数据不是另一个对象的成员时如何存储。如果它是另一个对象的成员,那么
它的存储会有些不同。
引用类型对象的数据部分始终存放在堆里,如图4-9所示。
值类型对象,或引用类型数据的引用部分可以存放在堆里,也可以存放在栈里,这依赖
于实际环境。
例如,假设有一个引用类型的实例,名称为MyType,它有两个成员:一个值类型成员和一个
引用类型成员。它将如何存储呢?是否是值类型的成员存储在栈里,而引用类型的成员如图4-9
所示的那样在栈和堆之间分成两半呢?答案是否定的。
请记住,对于一个引用类型,其实例的数据部分始终存放在堆里。既然两个成员都是对象数
据的一部分,那么它们都会被存放在堆里,无论它们是值类型还是引用类型。图4-10阐明了MyType
的情形。
尽管成员A是值类型,但它也是MyType实例数据的一部分,因此和对象的数据一起被存放在堆里。
成员B是引用类型,所以它的数据部分会始终存放在堆里,正如图中“数据"框所示。不同的是,它的引用部分也被存放在堆里,封装在MyType对象的数据部分中。
说明 对于引用类型的任何对象,它所有的数据成员都存放在堆里,无论它们是值类型还是引用类型。
C#类型的分类
表4-3列出了C#中可以使用的所有类型以及它们的类别:值类型或引用类型。每种引用类
型都将在后面的内容中阐述。