定义
装箱:将值类型赋值给 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 int32
将 object
类型的对象拆箱为 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;
答案:先直接调试看结论:
显然,报错在第 6
行,原因是装箱到 obj
对象的变量 i
为 int
类型,而拆箱时使用的是 long
类型,虽然 int
类型可以隐式转换为 long
类型,但做拆箱时,只能以装箱时的类型进行拆箱。
评论区