【问题标题】:Are these boxing/unboxing examples这些是装箱/拆箱示例吗
【发布时间】:2011-06-06 08:11:49
【问题描述】:

是 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 是装箱/拆箱的例子?

【问题讨论】:

  • 我认为是这样,因为您将 int 放入对象“盒子”中,然后将其从该盒子中取出。 box 和 unbox 背后的想法是将值类型更改为引用类型并返回

标签: c# boxing unboxing


【解决方案1】:

在所有三个示例中:

iBoxedi 的盒装副本。

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

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

【讨论】:

  • 我修复了示例 2,但无论如何都没有编译。
【解决方案2】:

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

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. 

【讨论】:

    【解决方案3】:

    打拳击的是object iBoxed = i

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

    【讨论】:

      【解决方案4】:

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

      object boxed = (object)i;
      

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

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

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

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

      【讨论】:

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