C# 装箱和拆箱
我对C#中的装箱和拆箱有点怀疑C# 装箱和拆箱,c#,value-type,boxing,C#,Value Type,Boxing,我对C#中的装箱和拆箱有点怀疑 上述代码可以称为装箱?不,这根本不是装箱int只是System.Int32的别名。该代码相当于: int i = 1; int j = i; 要进行装箱,必须转换为引用类型,例如 int i = 1; object j = i; 或: 不是。int是一种值类型 将值类型指定给对象时会发生装箱 这不是拳击 int是System.Int32的别名。因此,您的代码等同于 int i = 1; int j = i; 对于装箱,应该有到对象或接口的转换。喜欢 int
上述代码可以称为装箱?不,这根本不是装箱
int
只是System.Int32
的别名。该代码相当于:
int i = 1;
int j = i;
要进行装箱,必须转换为引用类型,例如
int i = 1;
object j = i;
或:
不是。int是一种值类型 将值类型指定给对象时会发生装箱 这不是拳击
int
是System.Int32
的别名。因此,您的代码等同于
int i = 1;
int j = i;
对于装箱,应该有到对象或接口的转换。喜欢
int i = 1;
object j = i;
类类型的值可以转换为object类型或
类仅通过处理
在编译时作为另一种类型引用。同样,类型为
对象或接口类型的值可以转换回
类类型而不更改引用(当然是运行时
在这种情况下,需要进行类型检查)
i.GetType(); //boxing occur here
或者将int
传递给需要引用类型的方法
void Foo(object obj) {}
Foo(i); //boxing, no overload takes an int
在第一个示例中,您可以清楚地看到box
说明
int i = 5;
i.GetType();
IL_0000: ldc.i4.5
IL_0001: stloc.0 // i
IL_0002: ldloc.0 // i
IL_0003: box System.Int32 //<---- boxing
IL_0008: call System.Object.GetType
结构的情况也一样,只是它们将使用
callvirt
opcode,如果nessecary,谢谢你,bhava,kalale aata,它将框住结构。
void Foo(object obj) {}
Foo(i); //boxing, no overload takes an int
int i = 5;
i.GetType();
IL_0000: ldc.i4.5
IL_0001: stloc.0 // i
IL_0002: ldloc.0 // i
IL_0003: box System.Int32 //<---- boxing
IL_0008: call System.Object.GetType
enum MyEnum {}
var e = new MyEnum();
e.ToString(); //box will occur here, see IL for details
IL_0000: ldc.i4.0
IL_0001: stloc.0 // e
IL_0002: ldloc.0 // e
IL_0003: box UserQuery.MyEnum
IL_0008: callvirt System.Object.ToString