装箱与拆箱及与泛型的效率对比

   装箱:将值类型转换为 object 类型或由此值类型实现的任何接口类型的过程,拆箱则反之

    对装箱的定义做几个简单的例子的说明吧,比较基础。

   1.只是类型转换,但都是值类型,不叫装箱

int n = 10;
double d = n;
Console.WriteLine(d);

  2.是将值类型转换为了引用类型,但是不叫装箱

int n = 10;
string s = n.ToString();//string与int是完全不同的两种类型,没有父子类关系
                        //不可能发生装箱和拆箱,因为本身就不具备类型直接转换的功能
Console.WriteLine(s);

  3.真正的装箱

 int n = 10;
 object o = n; //n是int类型,int就是Int32,而Int32是一个结构继承字System.ValueType
 Console.WriteLine(o); //而该类又继承自Object,所以int类型与object类型具有子父类关系,所以可以发生类型转换

  4.装箱拆箱的效率问题

装箱操作和拆箱操作因为转换,是要额外耗费cpu和内存资源的,所以在c# 2.0之后引入了泛型来减少装箱操作和拆箱操作消耗。

下面小例子显示与引入泛型后效率的对比

  4.1.普通的Arraylist型需要装箱,1千万个数:效率 4s

   ArrayList arrayList = new ArrayList();//arrayList集合无论装入什么数据,都变成object对象
   Stopwatch watch = new Stopwatch();
   watch.Start();
   for (int i = 0; i < 10000000; i++)
            {
                arrayList.Add(i);
            }
   watch.Stop();
   Console.WriteLine(watch.Elapsed);
   Console.ReadKey();

  4.2.泛型是不需要装箱的, 1千万个数:效率 0.3s

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

 

Written by

说点什么

欢迎讨论

avatar

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
提醒