C#基础加强(5)之装箱与拆箱

C#基础加强(5)之装箱与拆箱

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

定义

装箱:将值类型赋值给 Object 类型变量时,就是装箱操作,即包装为 Object 对象。

因为值类型都是 ValueType 类型,而 ValueType 页继承了 Object(CLR 内部处理),所以值类型可以转为 Object 类型。

拆箱:将 Object 类型变量赋值给值类型的时候就是拆箱操作,需要做显示转换。

示例

看如下示例:

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

我们查看它生成的 IL 语言:

.method public hidebysig static void Main(string[] args) cil managed
{
    .entrypoint
    .maxstack 1
    .locals init (
        [0] int32 num,
        [1] object obj2,
        [2] int32 num2)
    L_0000: nop 
    L_0001: ldc.i4.s 100
    L_0003: stloc.0 
    L_0004: ldloc.0 
    // <1>
    L_0005: box int32
    L_000a: stloc.1 
    L_000b: ldloc.1 
    // <2>
    L_000c: unbox.any int32
    L_0011: stloc.2 
    L_0012: ldloc.2 
    L_0013: call void [mscorlib]System.Console::WriteLine(int32)
    L_0018: nop 
    L_0019: ret 
}

对比看其实很直观,在 <1> 处通过 box int32 给我们编写的 int 类型的 100 装箱为 object 对象,而在 <2> 处通过 unbox.any int32object 类型的对象拆箱为 int 类型。

相关面试题

1、下面三句代码有没有错?

int i = 10;
object obj = i;
int j = obj;

答案:很明显上面代码使用错误的,因为拆箱(将 Object 类型的变量赋值给值类型)需要做显示转换,而第 3 行并没有。

2、下面代码会不会报错?为什么报错?

int i = 5;
object obj = i;
int j1 = (int) obj;
long j2 = i;
long j3 = (long) i;
long j4 = (long) obj;

答案:先直接调试看结论:

image.png

显然,报错在第 6 行,原因是装箱到 obj 对象的变量 iint 类型,而拆箱时使用的是 long 类型,虽然 int 类型可以隐式转换为 long 类型,但做拆箱时,只能以装箱时的类型进行拆箱。

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/csharp-basepro-5.html

Buy me a cup of coffee ☕.