值类型与引用类型的差异(.Net设计规范)

.Net设计规范中对值类型和引用类型做的对比,为了加深记忆,记录于此。

第一

引用类型在堆上分配,有垃圾收集器管理;而值类型要么在栈上分配并在栈展开时释放,要么内联在容纳它的类型中并在容纳它的类型呗释放时释放。因此,与引用类型的分配与释放相比,值类型的分配和释放开销更低。

第二

引用类型的数组不是内联分配的,也就是数组的元素只是一些引用,指向那些位于堆中的引用类型的实例。而值类型的分配是内联的,也就是说数组内的元素是值类型的真正实例。因此,值类型的分配和释放的开销比引用类型小得多。此外,大多数情况下,和引用类型相比,值类型数组具有更好地局部性。

第三

内存使用不同。值类型在被强制转换为引用类型或它们实现的借口之一时,要执行装箱操作。它们在被强制转换回值类型时,要执行拆箱操作。因为箱子是在堆上分配的对象,由垃圾收集器管理,所以太多的装箱和拆箱操作会对堆,垃圾收集器,并最终对应用程序的性能造成负面的影响。相比之下,在对引用类型执行转型操作时,不会发生装箱操作。
此外,引用类型的赋值只复制引用,而值类型会的赋值会复制整个值。因此大的引用类型赋值的开销比大的值类型赋值的开销要低。

最后

引用类型是以引用方式传递的,而值类型是以值方式传递的。改变引用类型的一个实例会影响到所有指向该实例的引用。值类型的实例在以值方式传递时被复制。当值类型的一个实例被改变时,显然不会影响它的任何副本。由于副本不是由用户显式地创建的,而是在传递参数或返回值时隐式创建的,因此可以更改的值类型会把许多用户搞糊涂。因此值类型时不可变的。

posted @ 2014-08-08 14:30  恭喜  阅读(200)  评论(0编辑  收藏  举报