博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
装箱和拆箱
阅读量:5222 次
发布时间:2019-06-14

本文共 1176 字,大约阅读时间需要 3 分钟。

在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;//扩大时(基类转换为派生类),显式转换,拆箱
        }
    }
}

转载于:https://www.cnblogs.com/Dicky/archive/2007/04/22/722934.html

你可能感兴趣的文章
C# winform DataGridView 常见属性
查看>>
逻辑运算和while循环.
查看>>
Nhiberate (一)
查看>>
c#后台计算2个日期之间的天数差
查看>>
安卓开发中遇到的小问题
查看>>
ARTS打卡第3周
查看>>
linux后台运行和关闭SSH运行,查看后台任务
查看>>
cookies相关概念
查看>>
CAN总线波形中ACK位电平为什么会偏高?
查看>>
MyBatis课程2
查看>>
桥接模式-Bridge(Java实现)
查看>>
svn客户端清空账号信息的两种方法
查看>>
springboot添加servlet的两种方法
查看>>
java的Array和List相互转换
查看>>
layui父页面执行子页面方法
查看>>
如何破解域管理员密码
查看>>
Windows Server 2008 R2忘记管理员密码后的解决方法
查看>>
IE11兼容IE8的设置
查看>>
windows server 2008 R2 怎么集成USB3.0驱动
查看>>
Foxmail:导入联系人
查看>>