C#的拆箱和装箱,以及拆装箱的性能问题

1:什么事装箱和拆箱:比如 

int     = 0  ;

object   o;   

 o = i;  //将具体的整型变量赋值个一个object,把子类的值赋值给了父类,这个过程就是装箱。

int  j  = (int)o ;  //反之,就是拆箱。如果已经知道了object中存放的是int类型,那么拆箱就能够成功,否则可能会出现类型转换异常

说简单点就是:把一个具体的子类对象赋值给了父类对象就可以理解为发生了装箱操作,将父类对象强转为具体的子类对象就是拆箱操作。里式转换法则:父类中包含的是子类对象,则可以强转成文子类对象

2:装箱拆箱过程的性能问题

将一个类型转换为另一个类型,的过程中始终都是有时间损耗的,所以不管是java还是C#都引入了泛型的概念,来避免拆箱装箱所带来的时间损耗问题,具体如下代码

namespace

{

    public class Test{ 

     public void Test001(){

               ArrayList arrayList = new ArrayList();
               Stopwatch s = new Stopwatch();

                s.Start();//--开始计时
               for (int i = 0; i < 40000000; i++)
               {
                   arrayList.Add(i);//这里发生了装箱的操作,将int装载成object(进行了40000000次的装箱)
               }
               s.Stop();--结束计时
               Console.WriteLine("装箱耗费时间:" + s.Elapsed);

} //func

    public void Test002(){

          List<int>  list  =  new List<int>();

          Stopwatch s = new Stopwatch();

           s.Start();//-开始计时

             for (int i = 0; i < 40000000; i++)
               {
                   list.Add(i);// list 默认只存放int型,所以没有装拆操作(进行了40000000次的装箱)
               }

                s.Stop();--结束计时
               Console.WriteLine("不装箱耗费时间:" + s.Elapsed);

}

}//class

 class  Program{

      static void main(string[] args){

     Test t = new Test();

             //调用两个方法分别测试拆装箱和不拆装箱执行同样的任务所耗的时间

              t.Test001();

              t.Test002();

}

}

}//namespace

测试结果如图:

因此,在数据量大,或者频繁操作 的情况下最好还是避免装箱和拆箱操作,从时间上来看,装箱耗费的时间资源是非常大的

如有异议还望指正

猜你喜欢

转载自blog.csdn.net/m0_37852399/article/details/83786217