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

相关文章
相关标签/搜索