C#中所有的数据类型都继承自基类System.Object,拥有共同的祖先类,所以值类型和引用类型可以互相转换(显式或隐式)。
从值类型向引用类型的转换过程称为装箱;
从引用类型向值类型的转换称为拆箱;
1、 装箱
值类型向引用类型的转换,装箱会在堆中分配一个对象实例(申请内存空间),并将值类型的值复制到这个对象中(内存空间),会消耗内存和CPU资源;
int i =123;
objectobj = i; //隐式装箱
for (int i = 0; i < arr.Length; i++)
{
//
}
在i< arr.Length时,会有一个装箱操作,当arr.Length很大时,会多次重复装箱,消耗系统内存,所以这种情况应先进行装箱:
int L = arr.Length;
for (int i = 0; i < L; i++)
{
//
}
2、 拆箱
引用类型向值类型的显示转换,拆箱首先会检查对象实例,确保它是给定值类型的一个装箱值,然后将引用类型所指向的内存中的值从堆中复制到值类型所在的栈上(不需要额外的内存开销,所以拆箱消耗的内存比装箱消耗的要少)。转换失败时,编译不会报错,但运行时会报错,所以在不确定引用类型的对象实例类型时,应该对其用基类.GetType().ToString()进行类型检查,基类使用全称,如String.String而不要用String;
objectobj = 123; //隐式装箱
int value= (int)obj; //显示拆箱