天天看點

.Net裝箱拆箱程式設計執行個體

.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);

   }

}

運作截圖;

.Net裝箱拆箱程式設計執行個體

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定義語句注釋掉的運作截圖分别如下;

.Net裝箱拆箱程式設計執行個體
.Net裝箱拆箱程式設計執行個體

工程源碼:

http://pan.baidu.com/s/1dDs7jdn

繼續閱讀