侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 748 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

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

zze
zze
2019-07-29 / 0 评论 / 0 点赞 / 398 阅读 / 2220 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

定义

装箱:将值类型赋值给 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 类型,但做拆箱时,只能以装箱时的类型进行拆箱。

0

评论区