1. 值类型直接存储其值, 变量本身就包含了其实例数据, 而引用类型保存的只是实例数据的内存引用。 因此,一个值类型变量就永远不会影响到其他的值类型变量,而两个引用类型变量则很有可能指向 同一地址,从而发生相互影响。 2. 从内存分配上来看, 值类型通常分配在线程的堆栈上, 作用域结束时, 所占空间自行释放, 效率高, 无需进行地址转换,而引用类型通常分配在托管堆上,由 GC 来控制其回收,需要进行地址转换,效 率降低,这也正是 c# 需要定义两种数据类型的原因之一。 3. 值类型均隐式派生自 System.ValueType , 而 System.ValueType 又直接派生于 System.Object, 每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值,注意所有的值类型都是密封 ( sealed )的,所以无法派生出新的值类型。而且 System.ValueType 本身是一个类类型,而不 是值类型,因为它重写了 object 的 Equals() 方法,所以对值类型将按照实例的值来比较,而不是 比较引用地址。 4. C# 的统一类型系统,使得值类型可以转化为对象来处理,这就是常说的装箱和拆箱。由于装拆箱 需要装建全新对象或做强制类型转换,这些操作所需时间和运算要远远大于赋值操作,因此不提倡 使用它,同时也要尽量避免隐式装拆箱的发生。 |