拳击和拆箱

时间:2013-03-22 08:43:19

标签: c# value-type boxing

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

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

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

4 个答案:

答案 0 :(得分:12)

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

int i = 1;
int j = i;

要进行装箱,必须转换为参考类型,例如

int i = 1;
object j = i;

或者:

int i = 1;
IComparable j = i;

答案 1 :(得分:2)

只是稍微扩展Jon的答案,当你调用基类的非重写或非虚方法时,也会发生装箱,比如

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操作码,如果nessecary将包装结构,

答案 2 :(得分:0)

没有。 int是值类型。

为对象指定值类型时会发生拳击。

答案 3 :(得分:0)

它不是拳击

intSystem.Int32的别名。所以你的代码等于;

int i = 1;
int j = i;

对于装箱,应该转换为对象或界面。等;

int i = 1;
object j = i;
  

类类型的值可以转换为类型对象或类型   接口类型,由类简单地通过处理   在编译时引用为另一种类型。同样,类型的值   对象或接口类型的值可以转换回a   类类型而不更改引用(但当然是运行时   在这种情况下需要进行类型检查。)