C#基礎增強(5)之裝箱與拆箱

定義

  • 裝箱:將值類型賦值給 Object 類型變量時,就是裝箱操做,即包裝爲 Object 對象。

    由於值類型都是 ValueType 類型,而 ValueType 頁繼承了 Object(CLR 內部處理),因此值類型能夠轉爲 Object類型。面試

  • 拆箱:將 Object 類型變量賦值給值類型的時候就是拆箱操做,須要作顯示轉換

示例

看以下示例:ide

internal class Program
{
    public static void Main(string[] args)
    {
        int i = 100;
        object numObj = i; // 裝箱
        int j = (int) numObj; // 拆箱
        Console.WriteLine(j); // 100
    }
}

咱們查看它生成的 IL 語言:spa

 1 .method public hidebysig static void Main(string[] args) cil managed
 2 {
 3     .entrypoint
 4     .maxstack 1
 5     .locals init (
 6         [0] int32 num,
 7         [1] object obj2,
 8         [2] int32 num2)
 9     L_0000: nop 
10     L_0001: ldc.i4.s 100
11     L_0003: stloc.0 
12     L_0004: ldloc.0 
13     L_0005: box int32
14     L_000a: stloc.1 
15     L_000b: ldloc.1 
16     L_000c: unbox.any int32
17     L_0011: stloc.2 
18     L_0012: ldloc.2 
19     L_0013: call void [mscorlib]System.Console::WriteLine(int32)
20     L_0018: nop 
21     L_0019: ret 
22 }

對比看其實很直觀,在第 13 行經過 box int32 給咱們編寫的 int 類型的 100 裝箱爲 object 對象,而在 16 行經過 unbox.any int32 將 object 類型的對象拆箱爲 int 類型。調試

相關面試題

一、下面三句代碼有沒有錯?code

1 int i = 10;
2 object obj = i;
3 int j = obj;

答案:很明顯上面代碼使用錯誤的,由於拆箱(將 Object 類型的變量賦值給值類型)須要作顯示轉換,而第 3 行並無。對象

二、下面代碼會不會報錯?爲何報錯?blog

1 int i = 5;
2 object obj = i;
3 int j1 = (int) obj;
4 long j2 = i;
5 long j3 = (long) i;
6 long j4 = (long) obj;

答案:先直接調試看結論:繼承

顯然,報錯在第 6 行,緣由是裝箱到  obj 對象的變量 i 爲 int 類型,而拆箱時使用的是 long 類型,雖然 int 類型能夠隱式轉換爲 long 類型,但作拆箱時,只能以裝箱時的類型進行拆箱。ip

相關文章
相關標籤/搜索