解析:CLR 支持两种类型:值类型和引用类型。用Jeffrey Richter(《CLR via C#》作
者)的话来说,“不理解引用类型和值类型区别的程序员将会把代码引入诡异的陷阱和诸多
性能问题”。这就要求我们正确理解和使用值类型和引用类型。
值类型包括 C#的基本类型(用关键字 int、char、float 等来声明),结构(用 struct 关
键字声明的类型),枚举(用 enum 关键字声明的类型);而引用类型包括类(用class
关键字声明的类型)和委托(用 delegate 关键字声明的特殊类)。
C#中的每一种类型要么是值类型,要么是引用类型。所以每个对象要么是值类型的实例,
要么是引用类型的实例。值类型的实例通常是在线程栈上分配的(静态分配),但是在某些
情形下可以存储在堆中。引用类型的对象总是在进程堆中分配(动态分配)。
C#的基本数据类型都与平台无关。C#的预定义类型并没有内置于语言中,而是内置于.NET
Framework 中。.NET 使用通用类型系统(CTS)定义可以在中间语言(IL)中使用的预
定义数据类型。C#中所有的数据类型都是对象。它们可以有方法、属性等。例如,在C#
中声明一个 int 变量时,声明实际上是 CTS(通用类型系统)中 System.Int32的一个实
例:
引用类型和值类型都继承自 System.Object类。不同的是,几乎所有的引用类型都直接从
System.Object 继承,而值类型则继承其子类,即直接继承System.ValueType。作为
所有类型的基类,System.Object提供了一组方法,这些方法在所有类型中都能找到。其
中包含 toString 方法及 clone 等方法。System.ValueType继承 System.Object。它没
有添加任何成员,但覆盖了所继承的一些方法,使其更适合于值类型。
C#的所有值类型均隐式派生自 System.ValueType:
数值类型:整型,sbyte(System.SByte 的别名),short(System.Int16),int
(System.Int32),long(System.Int64),byte(System.Byte),ushort
(System.UInt16),uint(System.UInt32),ulong(System.UInt64),char
(System.Char)。
用户定义的结构体(派生于 System.ValueType)。
枚举:enum(派生于 System.Enum)。