这些装箱/拆箱的例子

时间:2011-06-06 08:11:49

标签: c# boxing unboxing

是2个还是3个装箱/拆箱示例?

1)文档示例:

int i = 123;
object iBoxed = i;
i = (int) iBoxed;

2:拳击/拆箱也是吗?

int i = 123;
object iBoxed = i;
i = Int32.Parse(iBoxed.ToString());

3:拳击/拆箱也是吗?

int i = 123;
object iBoxed = i;
i = Convert.ToInt32(iBoxed);

我认为在所有例子中技术上都是一样的。

  1. 在堆栈上创建值类型
  2. 在堆栈上创建引用,该值将复制到堆中。
  3. 将堆值复制到引用。该引用将被删除。
  4. 所以我猜2和3是装箱/拆箱的例子吗?

4 个答案:

答案 0 :(得分:7)

在所有三个例子中:

iBoxedi

的盒装副本

在示例2中: 这里没有涉及拆箱,因为ToString是一个最终将解析为int.ToString的虚拟方法,然后由int.Parse进行解析,返回一个非加框的int在堆栈上。

在例3中: iBoxed将在方法Convert.ToInt32的主体中取消装箱,并再次作为非盒装整数返回。

答案 1 :(得分:2)

第二个例子是装箱而不是拆箱。 int.parse不会编译,因为它需要一个字符串,而iBoxed是一个对象。我认为你正在混合拳击和转换的概念。拳击实际上是关于采用值类型,即他们在C中所说的POD,并将其视为参考,拆箱是从容器中提取相同值类型的能力。

Ex 2.已修复

int i = 123;  // Assigment 
object iBoxed = i ; // This is boxing 
i = int.parse(iBoxed.toString());  //This is unboxing but only for the twostring method the assignment is a value type copy. 

答案 2 :(得分:1)

拳击是object iBoxed = i

示例2无法工作,因为int.Parse需要字符串

答案 3 :(得分:0)

在所有示例中,值类型i正在转换为对象。这是根据MSDN的拳击定义。拳击也可以通过以下方式完成:

object boxed = (object)i;

取消装箱是将对象转换回值类型 示例1是拆箱

示例2将无法编译,因为Parse需要string参数,但如果您iBoxed.ToString()

,则会取消装箱

示例3我怀疑没有取消装箱,因为Convert方法只会返回您传入的值。

值得了解拳击和拆箱的性能。它比正常的任务更昂贵。