(一)装箱与拆箱
(1)拆箱是从引用类性到值类型的转换,装箱是值类型到引用类性的转换。
装箱 是值类型到 object 类型或到此值类型所实现的任何接口类型的隐式转换。对值类型装箱会在堆中分配一个对象实例,并将该值复制到新的对象中。
拆箱 是从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换。注意,只能拆回最开始的类型。
int i=10; object obj=i;//(装箱,此时将值类型转换成引用类性,会开辟2个内存,一个存储obj的地址,一个存储其值,在这里obj的值为10.) int j=(int)obj;//j=10。拆箱,从值类型转换成引用类型,在这里开辟一个内存,存储j的值 int k=(int) obj;//k=10.拆箱。
装箱/拆箱的内部操作。
装箱:
对值类型在堆中分配一个对象实例,并将该值复制到新的对象中。按三步进行。
第一步:新分配托管堆内存(大小为值类型实例大小加上一个方法表指针和一个//SyncBlockIndex)。
第二步:将值类型的实例字段拷贝到新分配的内存中。
第三步:返回托管堆中新分配对象的地址。这个地址就是一个指向对象的引用了。
拆箱:
检查对象实例,确保它是给定值类型的一个装箱值。将该值从实例复制到值类型变量中。
(2)避免装箱的方法:
1、通过重载函数来避免。
2、通过泛型来避免。