.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