浅谈数据类型转换之装箱和拆箱

本文介绍了C#中的装箱和拆箱概念,解释了值类型如何转换为引用类型及反向转换的过程。并通过实例展示了装箱操作的隐式特性与拆箱时必须显式转换的要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
  • 装箱(Boxing)是把值类型转换为System.Object类型,或者转换成由值类型执行的接口类型.
  • 拆箱(unBoxing)是相反的转换过程

int -> Int32 是一个装箱的过程,反之则是拆箱的过程。许多其它变量类型也是如此,如:short <-> Int16long <-> Int64 等。

C# 是全面向对象的语言,比 Java 的面向对象都还彻底——它把简单数据类型通过默认的装箱动作封装成了类。Int32Int16Int64 等就是相应的类名,而那些我们熟悉的、简单易记的名称,如 intshortlong 等,我们就可以把它称作是 Int32Int16Int64 等类型的别名
Struct MyStruct
{
Public int val
}
//创建一个新的MyStruct类型的变量
MyStruct valType1=new MyStruct();
//给结构中的成员赋值
valType1.val=5;
//装箱到Object类型的变量refType1中
Object refType1=valType1;
以这种方式装箱变量而创建的对象,包含值类型变量的一个副本的引用,而不包含源值类型变量的引用
如下验证:
//修改val的值
valType1.val=6;
//拆箱操作
MyStruct valType2=(MyStruct)refType1;
//输出到控制台
Console.writeLine(“valType2.val={0}”,valType2.val);
 
运行结果:valType2.val=5
 
但是把一个引用类型赋予对象时,将得到不同的结果。例如把MyStruct由结构改为类,最后将得到valType2.val=6
也可以把值类型装箱到一个接口中,只要他们执行这个接口即可
假定:MyStruct执行IMyInterface接口
InterFace IMyInterface
{
}
Struct MyStruct:IMyInterface
{
Public int val;
}
MyStruct valType1=new MyStruct();
IMyInterface refType1=valType1;
 
MyStruct valType2=(MyStruct)refType1;
从范例中我们看到装箱操作无需编码是隐式的,但拆箱必须经过显示转换,即需要经过数据类型转换。
最后要注意的是,在访问值类型之前必须进行拆箱
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值