我对C#中的拳击和拆箱有一点疑问。
int i=1;
System.Int32 j = i;
上面的代码可以称为拳击吗?
答案 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)
它不是拳击。
int
是System.Int32
的别名。所以你的代码等于;
int i = 1;
int j = i;
对于装箱,应该转换为对象或界面。等;
int i = 1;
object j = i;
类类型的值可以转换为类型对象或类型 接口类型,由类简单地通过处理 在编译时引用为另一种类型。同样,类型的值 对象或接口类型的值可以转换回a 类类型而不更改引用(但当然是运行时 在这种情况下需要进行类型检查。)