欢迎加入站点基地设计开发交流群:30720409
详细内容
.Net里的装箱与拆箱的区别
发布日期:2013-08-21     点击:2316     字体:[ ]

.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”。

用户评论
昵称 
内容  *
验证码   
   
Copyright © 2010 zdbase.com All Rights Reserved. 苏ICP备15039389号-1 可人软件设计