装箱和拆箱

在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;//扩大时(基类转换为派生类),显式转换,拆箱
        }
    }
}
### 装箱拆箱的概念及原理 #### 定义与基本概念 装箱是指将值类型(如整数、浮点数等)转换为引用类型的对象的过程。此过程涉及创建一个新的对象实例并将该值复制到新对象中[^1]。 拆箱则是相反的操作,即将引用类型的数据重新转换回原始的值类型数据。这通常涉及到从对象中提取出存储的值并将其赋给相应的值类型变量。 ```csharp // C# 中的装箱操作示例 static void SimpleBoxUnbox() { int myInt = 25; object boxedInt = myInt; // 将 int 类型的数值放入 object 对象中 } // C# 中的拆箱操作示例 static void UnboxingExample() { object boxedInt = 25; int unboxedInt = (int)boxedInt; // 把 object 对象里的值取出来转成 int 类型 } ``` #### 性能考量 尽管装箱拆箱提供了灵活性,允许不同种类的数据可以被统一处理,然而这些操作会带来额外开销。每当发生一次装箱时,会在托管堆上分配新的内存用于存放这个临时的对象;频繁执行这样的操作可能会显著降低应用程序性能[^3]。 为了提高效率,在设计代码逻辑时应尽可能减少不必要的装箱行为。例如,使用泛型集合代替传统的非泛型集合能够有效规避这一问题,因为前者可以在编译期间保持原生的值类型而不必经历装箱/拆箱流程[^4]。 #### 不同编程语言间的差异 值得注意的是,在不同的面向对象的语言里实现上述机制的方式有所区别: - **C#:** 使用隐式的转型语法完成装箱(`object obj = valType`)以及显式强制转换来进行拆箱(`valType = (ValType)obj`)[^1]。 - **Java:** 同样支持自动化的装箱拆箱功能,不过具体语法规则略有差别——比如通过 `Integer.valueOf(int)` 方法手动触发装箱动作,而在某些情况下也会自动生成对应的指令来简化开发者的编码工作[^2]。 总之,理解这两种技术背后的运作机理对于编写高效且易于维护的应用至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值