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

    在C#中的有两种类型的变量:值类型和引用类型。当值类型和引用类型相互转化时,会发生装箱和拆箱的过程。这里有一点要声明:经过拆箱或装箱的对象会多出它自己一份拷贝,如图所示:

    从图可以看出它和它的拷贝不在一个存储区域。这也是值类型和引用类型的区别所在。值类型总是在栈中,而引用类型总是在托管堆中。(目前J2SE5.0也支持了装箱和拆箱,但是我目前不知道是否和C#一样)。为了进一步理解看下面例子:
    struct Point{
    public int x;
    public int y;
    }

    static void Main(){
    Point p;
    p.x=10;
    p.y=20;

    Object o=p;//box. 将值类型从栈中拷贝到堆中。

    /************************************************************************/
    /*
    * 从托管堆中将对象拷贝到栈中。
    * */
    /************************************************************************/
    Point p2=(Point)p;
    Console.WriteLine(“p2.x:=" p2.x “ p2.y:=“ p2.x);

    p.x=16;
    p.y=34;

    Console.WriteLine(“p2.x:=" p2.x “ p2.y:=“ p2.x);

    Console.WriteLine(“p.x:=" p.x “ p.y:=“ p.x);
    }

    输出结果为:
    p2.x:=10;p2.y=20;
    p2.x:=10;p2.y=20;
    p.x:=16;p.y=34;

    可知,变量经过拆箱/装箱后,得到是自己的另一份拷贝。

        装箱是指将值类型转换为引用类型的过程,拆箱是指将引用类型转换为值类型的过程。在装箱时采用隐式转换,在拆箱是时采用显示转换。即当派生类转换为基类时(缩小)采用隐式转换,当基类转换为派生类时(扩大)采用显式转换。

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace ConsoleAppExample.NetType
    {
        class BoxUnBox
        {
            static void Main()
            {
                int foo = 100;
                object bar = foo;//缩小时(派生类转换为基类),隐式转换,装箱
                int soo = (int)bar;//扩大时(基类转换为派生类),显式转换,拆箱
            }
        }
    }
  • 相关阅读:
    21天学通 C++(第8版) 内涵目录
    Python Linux系统管理与自动化运维
    零起点PYTHON足彩大数据与机器学习实盘分析
    Elasticsearch探索之路的障碍
    WEB程序设计 第7版
    Qt使用电容屏
    Hi3531D 交叉编译 Qt5.12.8
    Hi3531D 静态交叉编译 Qt5.13.2
    Qt 常用JSON解析示例
    Windows下搭建UBuntu + Qt 5开发环境
  • 原文地址:https://www.cnblogs.com/Dicky/p/722934.html
Copyright © 2011-2022 走看看