.Net装箱拆箱编程实例

来源:互联网 发布:旋风十一人网络更新 编辑:程序博客网 时间:2024/06/07 19:41

.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

0 0