简单地说:装箱就是数值型变量 向 引用型变量 转型,反之为拆箱。http://dev.csdn.net/develop/article/37/37470.shtm

解决方案 »

  1.   

    http://msdn.microsoft.com/library/cht/default.asp?url=/library/CHT/dncscol/html/csharp02152001.aspBoxing 和 Unboxing
    以下列程式碼為例:int value = 123;
    object o = value;   // box int into an object box
    int value2 = (int) o;   // unbox into value2當數值被設定為 o 時,作為設定作業的一部份,C# 編譯器會建立一個參考型別 Box,這個 Box 會大得足以在堆積上保存 int,接著將數值複製到該 Box,然後用實際型別來標記 Box (這個案例中是使用 System.Int32),這樣 Runtime 就知道 Box 中有些什麼型別。如果要從 Box 取出數值,必須用轉型來指定我們所認定的 box 中是什麼型別 (因為物件可以保存任何型別)。Runtime 會在執行時檢查物件變數所參考的型別是否就是轉型中所指定的型別。如果型別正確,就會將數值從 Box 複製回數值型別變數。如果型別不正確,就會擲回例外狀況 (Exception)。請注意,Unboxing 作業中不能發生其他轉換,型別必須完全相符。換句話說,如果寫成這樣:long value2 = (long) o;   // boxed value is an int而且 o 是一個 Box 的 int,就會擲回例外狀況。不過,我們可以寫成這樣:long value2 = (long)(int) o;轉換便會如預期地進行。 這個範例雖然可以解說 Box 和 Unbox,卻有些許誤導。撰寫程式碼來進行 Box 很少見,Box 通常都是發生於將數值型別變數傳遞至物件型別的參數時。 現在來個小小的測驗吧。希望大家都能用心作答。 問題:您對 Box 瞭解多少?
    下列這段程式碼提供不同的案例。請仔細看過這些案例,並判斷哪些案例用到 Box,哪些沒有用到。有些案例要檢視的不止一個地方 (例如,案例 B)。 // Scenario 1
    int total = 35;
    DateTime date = DateTime.Now;
    string s = String.Format("Your total was {0} on {1}", total, date);// Scenario B
    Hashtable t = new Hashtable();
    t.Add(0, "zero");
    t.Add(1, "one");// Scenario c
    DateTime d = DateTime.Now;
    String s = d.ToString();// Scenario IV
    int[] a = new int[2];
    a[0] = 33;
     
    // Scenario 101
    ArrayList a = new ArrayList();
    a.Add(33);// Scenario vi
    MyStruct s = new MyStruct(15);
    IProcess ip = (IProcess) s;
    ip.Process();答案
    看看答案並記下您的分數。案例 1
    String.Format() 以字串作為第一個參數,而以物件作為第二和第三個參數。Int 和 DateTime 都是數值型別,所以都會執行 Box 使成為第二和第三個參數。String.Format() 會接受這些參數,然後在各個參數上呼叫 object.ToString(),將它們轉換成字串表示。知道 int 會被執行 Box 動作者得一分,知道 DateTime 正在被執行 Box 動作者得一分。 案例 B
    Hashtable.Add() 採用兩個參數,一個用於索引鍵,一個用於數值。這兩個參數都是型別物件。為索引鍵傳遞的數值是整數,所以必須對它執行 Box 動作才能將它視為物件來傳遞。為數值傳遞的數值是字串,字串是參考型別,所以字串不會進行 Box 動作。搞懂這兩點各得一分。 案例 C
    這是一個有陷阱的案例。能夠執行 Box 的理由之一是,那樣才能夠在數值型別上呼叫虛擬函式,而 ToString() 是物件上的虛擬函式,所以看起來當 ToString() 被呼叫時,就會對 d 執行 Box 動作。然而,我們還沒有在 d 會被轉換成物件的情況中使用 d,所以不需要執行 Box。編譯器知道 DateTime 型別的變數只能是該種型別 (它不能是衍生型別,因為沒有衍生的數值型別),所以它可以直接呼叫 DateTime.ToString(),並將「這個」參考設定為指向堆疊上的 d 執行個體。答對這題者得一分。案例 IV
    CLR 中的陣列會直接儲存它們的值。例如,有五個項目的 int 陣列會配置足夠的空間來儲存五個 int,而不是五個物件。如果您回答不用執行 Box 就得一分。案例 101
    ArrayList.Add() 會以物件做為參數,所以整數 33 會被執行 Box。答對得一分。案例 vi
    介面是參考型別,所以將數值型別轉換成它所實作的介面時,必須對數值型別執行 Box 動作。知道這點得一分。http://rover.cs.northwestern.edu/~surana/blog/past/000059.html