C#中的装箱与拆箱

现在已经很少使用ArrayList与Hashtable,除去取数据不方便之外,在加入元素以及其余操作时,花费的时间也是比较多的,效率低;对其解释涉及到装箱和拆箱的问题;

一、什么是装箱和拆箱

装箱:将数值类型转换成引用类型的值

拆箱:将引用类型转换成数值类型

int n = 10;
            object o = n;//装箱

            int nn = (int)o;//拆箱

 

二、装箱与拆箱的判别

string str = "123";
            int a = Convert.ToInt32(str);

上述代码,虽然是由引用类型转换成值类型;但是并没有发生任何的装箱和拆箱的操作;

首先应该判断两者是否是继承关系,在判断是否是拆箱和装箱;上述代码中,string类型与Int类型并不是继承关系,所以不存在装箱和拆箱的关系;

 int b = 1233;
            IComparable c = b;

上述代码发生了装箱,首先int类型与IComparable类型是继承关系;int继承IComparable,又是由值类型转换成引用类型,所以发生了装箱;

三、检验装箱操作的效率

第一组:

ArrayList arraylist = new ArrayList();
            
            Stopwatch sw = new Stopwatch();
            sw.Start();
            
            for (int i=0;i<1000000;i++)
            {
                arraylist .Add(i);
            }
            sw.Stop();
            Console.WriteLine(sw.Elapsed);

输出:00:00:00.0427016

第二组:

            List<int> list = new List<int>();
            Stopwatch sw = new Stopwatch();
            sw.Start();
            for (int i=0;i<1000000;i++)
            {
                list.Add(i);
            }
            sw.Stop();
            Console.WriteLine(sw.Elapsed);

输出:00:00:00.0111906

第一组代码耗时长一些,因为发生了装箱;arrayList.Add();中的参数是Object类型的,输入的是int类型,所以发生了由值类型到引用类型的转换;

所以以后在写代码的过程中,尽量避开装箱和拆箱操作,这样会降低效率;

上一篇:并行处理本地数据PLINQ


下一篇:统计代码耗时的4种方法