2

我对 C# 中的装箱和拆箱有一点疑问。

int i=1;
System.Int32 j = i;

上面的代码可以称为拳击吗?

4

4 回答 4

12

不,那根本不是拳击。int只是. _ _ System.Int32该代码相当于:

int i = 1;
int j = i;

要发生装箱,必须转换为引用类型,例如

int i = 1;
object j = i;

或者:

int i = 1;
IComparable j = i;
于 2013-03-22T08:44:22.243 回答
2

只是为了稍微扩展乔恩的答案,当您调用基类的非覆盖或非虚拟方法时,也会发生装箱,例如

i.GetType(); //boxing occur here

或传递int给需要引用类型的方法

void Foo(object obj) {}

Foo(i); //boxing, no overload takes an int

在第一个示例IL中,您可以清楚地看到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

如果你不覆盖值类型中的虚方法,它们在调用它们时也会被装箱

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

与结构相同的情况,除了它们将使用callvirt操作码,如果需要,它将对结构进行装箱,

于 2013-03-22T08:48:17.097 回答
0

不。 int 是一种值类型。

将值类型分配给对象时会发生装箱。

于 2013-03-22T08:45:20.393 回答
0

这不是拳击

int是 的别名System.Int32。所以你的代码等同于;

int i = 1;
int j = i;

对于拳击,应该有一个对象或接口的转换。像;

int i = 1;
object j = i;

只需在编译时将引用视为另一种类型,即可将类类型的值转换为对象类型或由该类实现的接口类型。同样,对象类型的值或接口类型的值可以在不更改引用的情况下转换回类类型(但在这种情况下当然需要运行时类型检查)。

于 2013-03-22T08:48:05.693 回答