【问题标题】:Whether It is Boxing Or Unboxing?是装箱还是拆箱?
【发布时间】:2015-05-03 14:01:56
【问题描述】:

int i = 5;

字符串 str = i.ToString();

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

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

所以是装箱还是拆箱???

编辑: 现在来看第二个声明是装箱还是拆箱???

【问题讨论】:

  • 对于拆箱,您必须明确提及数据类型,例如它的拆箱版本是:string str = (string)i;
  • 我不认为这是装箱或拆箱。
  • @UsmanWaheed 开箱了吗?
  • 在这种情况下,答案实际上都不是。 int 上的某些方法需要装箱,但因为 ToString()object 上是虚拟的并被 int 覆盖,所以这里不需要装箱。
  • @Saurabh 两者都不是 - 请参阅我的回答和 dlev 的评论 :)

标签: c# boxing unboxing


【解决方案1】:

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

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

.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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      装箱是将值类型转换为类型对象或此值类型实现的任何接口类型的过程。当 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
      

      【讨论】:

      • 答案很明确,但是您并没有回答他的代码是装箱还是拆箱的实际问题。
      【解决方案4】:

      将数据分配给对象数据类型时会发生装箱。由于您没有这样做,因此没有装箱或拆箱。

      【讨论】:

        【解决方案5】:

        装箱用于将值类型(字符串除外)转换为对象类型 使用 ToString() 方法进行装箱 拆箱用于将对象类型转换为引用类型(字符串) 使用任何数据类型(字符串除外).parse() 方法

        【讨论】:

          猜你喜欢
          • 2012-07-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-28
          • 1970-01-01
          • 2011-12-25
          相关资源
          最近更新 更多