.net中的装箱与拆箱!

装箱是值类型到 object 类型或到该值类型所实现的任何接口类型的隐式转换。将一个值的值装箱会分配一个对象实例并将该值复制到新的对象中。
请看以下值类型变量的声明:
int i = 123;
以下语句对变量 i 隐式应用装箱操作:
object o = i;
此语句的结果是在堆栈上创建对象 o,而该对象在堆上引用 int 类型的值。该值是赋给变量 i 的值类型值的一个副本。下图说明了两个变量 i 和 o 之间的差异。

装箱转换:
               

也可以(但绝不必要)如下例所示显式执行装箱:
int i = 123;
object o = (object) i;

示例

此例将整数变量 i 通过装箱转换为对象 o。这样,存储在变量 i 中的值就从 123 更改为 456。此例显示对象保留了内容的原始副本,即 123。
// boxing.cs
// Boxing an integer variable
using System;
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);
   }
}

输出:
The value-type value = 456
The object-type value = 123


取消装箱是从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换。取消装箱操作包括:
检查对象实例,确保它是给定值类型的一个装箱值。
将该值从实例复制到值类型变量中。
以下语句同时说明了装箱和取消装箱操作:
int i = 123;          // A value type
object box = i;       // Boxing
int j = (int)box;     // Unboxing
下图显示了以上语句的结果。

取消装箱转换:
                

为使到给定值类型的取消装箱转换在运行时取得成功,源参数的值必须是对某个对象的引用,而该对象先前是通过将该值类型的值装箱创建的。如果源参数为 null 或是对一个不兼容对象的引用,则会引发 InvalidCastException。

示例:

下面的示例阐释无效取消装箱的情况,即错误的取消装箱如何导致 InvalidCastException。通过使用 try catch,发生错误时会显示错误信息。
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;
         Console.WriteLine("Unboxing OK.");
      }

      catch (InvalidCastException e)
      {
         Console.WriteLine("{0} Error: Incorrect unboxing.",e);
      }
   }
}

输出:
System.InvalidCastException
   at UnboxingTest.Main() Error: Incorrect unboxing.

如果将下列语句:

int intJ = (short) o;

更改为:

int intJ = (int) o;

转换将执行,而您将得到输出Unboxing OK”。


-----------------------------------phq  2005-02-02 22:19:49

posted on 2005-02-02 22:21  边缘程序员2011  阅读(3664)  评论(0编辑  收藏  举报