5

是 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. 堆值被复制到引用。引用被删除。

所以我猜 2 和 3 是装箱/拆箱的例子?

4

4 回答 4

7

在所有三个示例中:

iBoxed是 的盒装副本i

在示例 2 中:这里不涉及拆箱,因为ToString最终将解析为 的虚拟方法,int.ToString然后将由 解析,返回堆栈上的int.Parse未装箱。int

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

于 2011-06-06T08:20:10.833 回答
2

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

例 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. 
于 2011-06-06T08:20:35.890 回答
1

它是object iBoxed = i做拳击的。

示例 2 不起作用,因为int.Parse需要一个字符串

于 2011-06-06T08:19:59.680 回答
0

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

object boxed = (object)i;

拆箱是将对象转换回值类型。
示例 1 是拆箱

示例 2 将无法编译,因为Parse需要一个string参数,但如果你这样做了,它将被取消装箱iBoxed.ToString()

示例 3 我怀疑不是拆箱,因为该Convert方法只会返回您传入的值。

值得一提的是装箱和拆箱对性能的影响。它比正常分配更昂贵。

于 2011-06-06T08:22:57.370 回答