什么是装箱拆箱?
装箱是将值类型转换为引用类型
拆箱是将引用类型转换为值类型。
值类型和引用类型详见: link.
利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换。
需要注意的是被装过箱的对象才能被拆箱。
为什么需要装箱?
一种最普通的场景是,调用一个含类型为Object的参数的方法,该Object可支持任意为型,以便通用。当你需要将一个值类型(如Int32)传入时,需要装箱。
装箱拆箱引发的效率问题
例如:int a = 100; object b = a;
这就是一个简单的装箱,可以看出装箱时,生成的是全新的引用对象,这会有时间损耗,也就是造成效率降低。因此需要避免装箱,拆箱操作。
对于装箱和拆箱对性能的解决办法是在程序中使用大量的泛型来代替装箱拆箱操作。
例如
下面展示一些 装箱拆箱代码片
,通过如下操作会发现非常耗时。
ArrayList myArrayList = new ArrayList();//这是一个引用类型
int count;//这是一个值类型
for(count = 0; count <50000000 ; count++)
{
myArrayList.Add(count);//装箱操作
int j;
j= (int)myArrayList[count];//拆箱操作
}
我们可使用泛型来代替如上代码,性能就会优化很多
List<int> myArrayList = new List<int>();//这是一个泛型
int count;//这是一个值类型
for(count = 0; count <50000000 ; count++)
{
myArrayList.Add(count);//将值类型加入泛型数组
int j;
j= myArrayList[count];//得到j
}