zoukankan      html  css  js  c++  java
  • 装箱与拆箱

    把值类型转换为引用类型,叫装箱。把引用类型转换为 值类型,称之为拆箱。

    看例子:

    1  int n = 10;
    2             string s = n.ToString();//不是装箱
    3 
    4 
    5             object o = 10;//是装箱
    6 
    7             Console.ReadKey();
    View Code

    1.定义。

    2.转换的两个类型能自动兼容另一个类型。(更本质的说,二者存在直系的继承关系,而不是兄弟关系)

    int继承于valuetype,valuetype继承于object.  string 直接继承object. 所以int和string不是父子类关系(是分支上的兄弟关系),也不能自动转换。

    装箱或者拆箱的两个类型必须是有父子类关系的。对于toString()方法,是把一种类型转换为了另一种类型(会在内存 中开辟空间),int和string类型本身不会有自动转换的功能,所以第一种情况不是装箱。

     1  Person p = new Person();
     2             object op = p;//不是装箱,二者都是引用类型。
     3             int i = 10;
     4             double d = i;
     5             int di = (int)d;//不是拆箱,因为二者都是值类型
     6 
     7             object o1 = 10;//是装箱。
     8             int oi=(int)o1;//是拆箱。
     9 
    10             Console.ReadKey();
    View Code

    注意:

    1             double d = 10;
    2             object o = d;
    3             int i = (int)o;
    4             Console.WriteLine(i);
    View Code

    上面的代码包含装箱和拆箱,但是在拆箱的时候会报错。装箱装进去的什么类型,拆箱的时候也必须用相同的类型接收。

    效率问题:

     1  //ArrayList arr = new ArrayList();
     2             //Stopwatch stop = new Stopwatch();
     3             //stop.Start();
     4             //for (int i = 0; i < 20000000; i++)
     5             //{
     6             //    arr.Add(i);//耗时:00:00:04.3049126
     7             //}
     8             //stop.Stop();
     9             //Console.WriteLine(stop.Elapsed);
    10 
    11             List<int> list = new List<int>();
    12             Stopwatch stop = new Stopwatch();
    13             stop.Start();
    14             for (int i = 0; i < 20000000; i++)
    15             {
    16                 list.Add(i);//耗时:00:00:00.3916002
    17             }
    18             stop.Stop();
    19             Console.WriteLine(stop.Elapsed);
    View Code

    很明显,装箱和拆箱很耗性能。

    案例:

     1  int m = 10, n = 11;
     2             string s1 = "a";
     3             string s2 = "32";
     4 
     5             string str = m + s1 + n + s2;//这里发生了两次装箱.会把int装入object.
     6             //string str = m + n + s1 + s2;//只发生了一次装箱.先把m+n计算出来,然后装箱。
     7             int p = int.Parse(str);
     8 
     9             Console.WriteLine("{0}",p);//发生了一次装箱,参数传递的是object类型。
    10             //Console.WriteLine(p);//没有装箱。
    View Code
  • 相关阅读:
    visio画UML用例图没有include关系的解决方法
    个人推荐-几款好用的App
    win10锁屏壁纸文件夹Assets中无文件问题的解决方法
    云服务器搭建Jupyter-主要部分为配置服务器安全组+添加python3
    开通博客的第一天
    express学习(二)—— Post()类型和中间件
    自定义模块
    命名参数名(含*args , * *kw的区别)
    Python学习之中文注释问题
    Python学习之再议row_input
  • 原文地址:https://www.cnblogs.com/wesley168/p/6497993.html
Copyright © 2011-2022 走看看