一、值类型
除去string外,所有的预定义基础类型都是值类型。值类型直接包含值。换句话说,该变量指向内存中存储(变量)值的同一地址。
正因为如此,当一个不同的变量被分配了相同的值,原始变量的值的内存副本改变到新的变量的地址。一个相同值类型的第二个变量不能指向内存中的第一个变量相同的地址。因此,改变了第一个变量的值不会影响到第二个值。
如下图:
如上图,number1指向包含值42的内存中的特殊地址,将number1分配给number2后,这两个变量都包含值42。然而,修改任何一个变量的值不影响另外一个。
类似地,传递一个值类型到一个方法(类如Console.WriteLine())会导致内存复制,方法中参数的任何改变不会影响调用函数范围内的原始值。因为值类型需要一个内存复制,通常它们应当被定义为小额内存开销(小于16字节)
二、变量类型
引用类型和引用它们的变量指向数据存储地址。引用类型存储了数据存储地址的引用,而不是直接存储数据。因此,访问数据时,运行时将读取(引用变量的)内存位置,并跳到包含数据的内存地址。一个引用类型指向的数据内存区域是一个Heap(堆),如下图
一个引用类型并不像值类型那样需要数据的相同的内存副本,后者效率更高但会导致一些问题。当把一个引用类型的变量值赋给另外一个引用类型变量时,仅 有一次地址的内存复制发生,因此,引用类型需要的内存复本总是内存地址本身大小(32位处理器复制32bit,64位处理器复制64bit)。
显然,不复制数据将比值类型的(复制)快一些,特别是后者的数据较庞大时。由于引用类型仅仅复制数据的地址,两个不同的变量能指向相同的数据,通过 一个变量改变数据将改变另一个变量。在赋值或方法调用时均如此。因此,一个方法会影响引用类型的数据并返回给调用者。由于这个原因,选择定义一个变量为值 类型还是引用类型的决定性因素是该对象是否在逻辑上是一样的大小不变的固定值,如果是,则值类型。
string,自定义的类属于引用类型。
--邀月译自《Essential C# 4.0》
附:
值类型:基础数据类型(整型、布尔型、字符型、实数型)、结构型、枚举型。
引用类型:类、对象、string、数组、接口、委托。
助人等于自助! 3w@live.cn