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

我对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 i = 1;
object j = i;
类类型的值可以转换为object类型或 类仅通过处理 在编译时作为另一种类型引用。同样,类型为 对象或接口类型的值可以转换回 类类型而不更改引用(当然是运行时 在这种情况下,需要进行类型检查)


只是稍微扩展一下Jon的答案,当您调用基类的非重写或非虚拟方法时,也会出现装箱,如

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