- 装箱(Boxing)是把值类型转换为System.Object类型,或者转换成由值类型执行的接口类型.
- 拆箱(unBoxing)是相反的转换过程
int -> Int32 是一个装箱的过程,反之则是拆箱的过程。许多其它变量类型也是如此,如:short <-> Int16,long <-> Int64 等。
C# 是全面向对象的语言,比 Java 的面向对象都还彻底——它把简单数据类型通过默认的装箱动作封装成了类。Int32、Int16、Int64 等就是相应的类名,而那些我们熟悉的、简单易记的名称,如 int、short、long 等,我们就可以把它称作是 Int32、Int16、Int64 等类型的别名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;
从范例中我们看到装箱操作无需编码是隐式的,但拆箱必须经过显示转换,即需要经过数据类型转换。
最后要注意的是,在访问值类型之前必须进行拆箱