C# 中 装箱和拆箱的基本介绍

装箱:将值类型转换为引用类型  

拆箱:将引用类型转换为值类型

值类型: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泛型集合中指定了数值类型, 所以没有进行拆箱装箱操作, 时间只用了上面操作的十分之一而已, 所以说,频繁的装箱和拆箱对系统的消耗很大,

注:

我们看两个类型之间是否发生装箱或者拆箱,首先要确定这两个类型之间是否存在继承关系。

如果存在,则有可能会发生拆箱或者装箱,

如果不存在继承关系,则不会发生装箱或者拆箱。

注意:装箱的时候使用什么类型装的箱,拆的时候也得使用对应的类型进行拆箱。(里氏转换)

原文地址:https://www.51baidu.com.cn/Home/Detail/1442

猜你喜欢

转载自blog.csdn.net/IT_rookie_newbie/article/details/82584744