装箱与拆箱
值类型不需要再托管堆中分配,不被垃圾回收,不通过指针引用,
但很多时候我们往往需要获取对值类型实例的引用
比如传一个值类型实例作为实参
然而形参有时确实Object类型
形如
Int32 a=0;
Object obj=(Object )a;
这类操作称作装箱,即值类型换成引用类型。
装箱步骤
1.在托管堆中分配内存,分配的内存量是值类型各字段所需要的内存量再加上两个额外成员(类型对象指针+同步块索引)
2.值类型字段复制到新分配的堆内存。
3.返回对象地址,现在该地址是对象引用。
然而对于拆箱,
以
Point p;
Arraylist a=new ArrayList();
a.Add(p);
p=(Point)a[0];
最后一个语句为拆箱
则一个已装箱的对象中所有字段赋值到值类型p中,p在栈中
1.获取已装箱对象中各个Point字段地址,这步称为拆箱。
2.再讲字段包含的值从堆赋值到基于栈的值类型实例中。
可见装箱代价比较大,在代码中要避免重复装箱