.Net装箱拆箱编程实例
装箱是将值类型转换为引用类型 ;拆箱是将引用类型转换为值类型。
利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链接起来。
由于C#中所有的数据类型都是由基类System.Object继承而来的,所以值类型和引用类型的值可以通过显式(或隐式)操作相互转换,而这转换过程也就是装箱(boxing)和拆箱(unboxing)过程。
二
装箱是将值类型转换为 object 类型或由此值类型实现的任何接口类型的过程。当 CLR 对值类型进行装箱时,会将该值包装到 System.Object 内部,再将后者存储在托管堆上。取消装箱将从对象中提取值类型。装箱是隐式的;取消装箱是显式的。装箱和取消装箱的概念是类型系统 C# 统一视图的基础,其中任一类型的值都被视为一个对象。
相对于简单的赋值而言,装箱和取消装箱过程需要进行大量的计算。对值类型进行装箱时,必须分配并构造一个新对象。取消装箱所需的强制转换也需要进行大量的计算,只是程度较轻。
装箱用于在垃圾回收堆中存储值类型。装箱是值类型到 object 类型或到此值类型所实现的任何接口类型的隐式转换。对值类型装箱会在堆中分配一个对象实例,并将该值复制到新的对象中。
取消装箱是从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换。取消装箱操作包括:
检查对象实例,以确保它是给定值类型的装箱值。
将该值从实例复制到值类型变量中。
三 编程实例
1 演示正常的装箱拆箱
using System;
// boxing.cs
// Boxing an integer variable
class TestBoxing
{
public static void Main()
{
int i = 123;
object o = i; // Implicit boxing
i = 456; // Change the contents of i
Console.WriteLine("The value-type value = {0}", i);
Console.WriteLine("The object-type value = {0}", o);
//装箱和取消装箱操作:
int i2 = 123; // A value type
object box = i2; // Boxing
int j2 = (int)box; // Unboxing
Console.WriteLine(box);
Console.WriteLine(j2);
Console.Write("按任意键继续 . . . ");
Console.ReadKey(true);
}
}
运行截图;
2 正常的装箱拆箱和拆箱发生异常时捕获到异常
using System;
public class UnboxingTest
{
public static void Main()
{
int intI = 123;
// Boxing
object o = intI;
// Reference to incompatible object produces InvalidCastException
try
{
int intJ = (short) o;
//int intJ = (int) o;
Console.WriteLine("Unboxing OK.");
Console.Write("按任意键继续 . . . ");
Console.ReadKey(true);
}
catch (InvalidCastException e)
{
Console.WriteLine("{0} Error: Incorrect unboxing.",e);
Console.Write("按任意键继续 . . . ");
Console.ReadKey(true);
}
}
}
上述程序分别把上面一句 int intJ定义语句和下面一句int intJ定义语句注释掉的运行截图分别如下;
工程源码:
http://pan.baidu.com/s/1dDs7jdn