无论是拳击还是拆箱?

时间:2014-03-04 05:29:16

标签: c# boxing unboxing

  

int i = 5;

     

string str = i.ToString();

     

String str1 =(String)i.ToString();

由于Int是值类型,String是引用类型

所以无论是拳击还是拆箱???

编辑: 现在是第二个声明无论是拳击还是拆箱???

5 个答案:

答案 0 :(得分:4)

您的代码不是取消装箱或装箱的示例,而是Int32.ToString()的方法调用,并将返回值分配给stringi.ToString()调用不会将int分配给对象,而是将其传递给返回string的方法。使用(string)强制转换的第二行是多余的,C#编译器甚至不会将其发送到IL。

例如,如果你在主方法中有这个:

.method private hidebysig static 
    void Main (
        string[] args
    ) cil managed 
{
// Method begins at RVA 0x2050
// Code size 19 (0x13)
.maxstack 1
.entrypoint
.locals init (
    [0] int32 i
)

IL_0000: ldc.i4.5
IL_0001: stloc.0
IL_0002: ldloca.s i
IL_0004: call instance string [mscorlib]System.Int32::ToString()
IL_0009: pop
IL_000a: ldloca.s i
IL_000c: call instance string [mscorlib]System.Int32::ToString() // cast isn't here
IL_0011: pop
IL_0012: ret
} // end of method Program::Main

如果你是拳击整数:

int i = 1; 
object iBox = i; 

发射:

.locals init (
    [0] int32 i,
    [1] object o
)

IL_0000: nop
IL_0001: ldc.i4.5
IL_0002: stloc.0
IL_0003: ldloc.0
IL_0004: box [mscorlib]System.Int32
IL_0009: stloc.1
IL_000a: ret

注意box操作码。如果您不确定某些东西是装箱还是拆箱,您可以查看IL并查看该操作码是否存在。

如果要拆箱整数:

int j = (int) iBox;

此过程与其他值类型类似,例如booldouble

答案 1 :(得分:1)

Boxing是将值类型转换为类型对象或由此值类型实现的任何接口类型的过程。取消装箱从对象中提取值类型。 在这种情况下,它既不是装箱也不是拆箱。

答案 2 :(得分:0)

Boxing是将值类型转换为类型对象或由此值类型实现的任何接口类型的过程。当CLR选中一个值类型时,它将值包装在System.Object中并将其存储在托管堆上。

取消装箱从对象中提取值类型。 拳击是隐含的;拆箱是明确的。

装箱和拆箱的概念是类型系统的C#统一视图的基础,其中任何类型的值都可以被视为对象。

在下面的示例中,整数变量i被加框并分配给对象o。

<强> C#

int i = 123;
// The following line boxes i. 
object o = i;  

然后可以取消对象o并将其分配给整数变量i:

<强> C#

o = 123;
i = (int)o;  // unboxing

答案 3 :(得分:0)

将数据分配给对象数据类型时发生

装箱。因为你没有这样做,所以它不是拳击或拆箱。

答案 4 :(得分:0)

boxing用于将值类型(字符串除外)转换为对象类型 使用ToString()方法进行装箱 unboxing用于将对象类型转换为引用类型(字符串) 使用anydatatype(字符串除外).parse()方法