|
值类型 |
引用类型 |
变量存放的内容 |
实际值 |
引用 |
默认值 |
0 |
空 |
内存分配 |
分配在栈中 |
分配在堆中 |
内存回收 |
作用域结束时,所占空间自行释放 |
使用完后不立即回收,而是交给GC处理回收 |
效率 |
值类型效率高,不需要地址转换 |
引用类型效率较低,需要进行地址转换 |
赋值操作 |
创建一个新对象 |
创建一个引用 |
类型扩展 |
不易扩展,所有值类型都是密封(seal)的,所以无法派生出新的值类型 |
具有多态的特性,方便扩展 |
|
装箱 |
拆箱 |
概念 |
值类型→引用类型
装箱是值类型到 object 类型或到此值类型所实现的任何接口类型的隐式转换。 |
引用类型→值类型
拆箱从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换。 |
举例 |
//装箱,将值类型转换为引用类型。
int val= 100; object obj= val; //隐式转换 Console.WriteLine (“对象的值= {0}", obj); |
//拆箱,将值类型转换为引用类型,再由引用类型转换为值类型的过程。 int val= 100; object obj= val; int num= (int) obj; //显式转换 Console.WriteLine ("num: {0}", num); |
内部操作 |
1)首先从托管堆中为新生成的引用对象分配内存。 2)然后将值类型的数据拷贝到刚刚分配的内存中。 3)返回托管堆中新分配对象的地址。 |
1)首先获取托管堆中属于值类型那部分字段的地址,这一步是严格意义上的拆箱。 2)将引用对象中的值拷贝到位于线程堆栈上的值类型实例中。 |
注:被装过箱的对象才能被拆箱 |
原文:http://blog.csdn.net/cyl_happygirl/article/details/23019373