装箱:将值类型转换为引用类型
拆箱:将引用类型转换为值类型
值类型:int double decimal enum struct bool char ...
引用类型:数组 集合 自定义类 string object...
装箱和拆箱会对系统消耗很大, 下面我们通过代码来看一下,
ArrayList listArr = new ArrayList();
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 10000000; i++)
{
listArr.Add(i);//装箱
}
sw.Stop();
Console.WriteLine(sw.Elapsed); //获取运行的时间
Console.ReadKey();
向ArrayList集合中添加数据的类型是object,也就是说是将 值类型转换为引用类型, 是进行了装箱操作,上面的代码进行了一千万次装箱操作,共耗时2秒多,
下面来看一个没有装箱或者拆箱的操作
List<int> list = new List<int>();
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 10000000; i++)
{
list.Add(i);
}
sw.Stop();
Console.WriteLine(sw.Elapsed); //获取运行的时间
Console.ReadKey();
由于list泛型集合中指定了数值类型, 所以没有进行拆箱装箱操作, 时间只用了上面操作的十分之一而已, 所以说,频繁的装箱和拆箱对系统的消耗很大,
注:
我们看两个类型之间是否发生装箱或者拆箱,首先要确定这两个类型之间是否存在继承关系。
如果存在,则有可能会发生拆箱或者装箱,
如果不存在继承关系,则不会发生装箱或者拆箱。
注意:装箱的时候使用什么类型装的箱,拆的时候也得使用对应的类型进行拆箱。(里氏转换)