CLR中值类型和引用类型的区别

CLR支持两种类型:值类型和引用类型。它们的区别主要表现在以下几个方面:

1. 对于引用类型来说,主要是从在托管堆中分配空间来保存它的实例,然后通过一个类似指针的变量来引用它。而值类型是一种轻量级的类型,主要从线程的堆栈中分配空间,并不需要一个类似指针的变量来引用它。

2. 由于引用类型的实例分配在托管堆上,它的生命周期受垃圾回收器的管理,而值类型直接分配在线程堆栈上,它的生命周期随堆栈的弹出而结束。

3. 值类型一般都有两种表现形式:拆箱形式和装箱形式,而引用类型就只有装箱这样一种表现形式。

4. 值类型继承于System.ValueType,而引用类型只是继承于System.Object,并没有继承于System.ValueType.

5. 值类型不能被继承,也不能继承其它类型,不管是值类型还是引用类型。值类型中不能有虚方法,它的所有方法都不能被重写。而引用类型可以被继承,也可以继承其它引用类型,可以定义虚方法,然后被子类进行重写。

6. 引用类型变量在创建时,一般被CLR初始化为NULL,如果程序试图引用一个NULL的引用类型变量,NullReferenceException将被抛出。而值类型被创建时,其所有成员的值都被初始化为0,所以不会有NullReferenceException被抛出。

7. 值类型变量之间进行赋值时,其所有成员的值都被复制。而引用类型变量进行赋值时,只是简单地复制指向一个对象的引用。

8. 因为不同的引用类型变量有可能引用同一个对象,所以对其中的一个引用类型变量进行操作时有可能影响到其它的引用类型变量所引用的对象。而值类型变量之间都有自己的一份数据拷贝,对它们的操作不会互相影响。

以上是我在学习CLR的时候进行的总结,写出来让大家一起讨论。如果有什么不对的地方,欢迎指出并提出自己的看法。

posted on 2008-09-27 14:41  瑞德  阅读(510)  评论(0编辑  收藏  举报

导航