当它是引用类型的字段时是值类型装箱吗?

时间:2011-10-05 08:34:13

标签: c# .net value-type boxing

有代码:

struct A
{
   int b;
}

class B
{
  A a;
  int b;
}

问题是:

  1. B是否装箱?
  2. B中是否位于堆栈或堆中?
  3. B是否为A盒装?
  4. 是在堆栈中还是在堆中?
  5. b是B盒装了吗?
  6. B是B堆栈还是堆?
  7. 我真的不明白:(

5 个答案:

答案 0 :(得分:7)

1)不,这里没有拳击。

2)a将在堆上,尽管这是一个实现细节

3)否,b中的A未加框

4)b中的A将存在于包含A的所有位置(因此,对于A类型的局部变量,它通常位于堆栈中;使用类B之类的实例变量或任何静态变量,它将在堆上);再次,这是一个实现细节

5)b中的B未加框

6)b中的B将在堆上 - 再次,实现细节

此处没有拳击,因为您没有显示任何尝试将值类型值用作引用类型值(例如object或接口)的任何内容。

同样,整个堆栈/堆的区别是一个实现细节。你应该阅读Eric Lippert的blog posts on the topic

答案 1 :(得分:2)

使用Google我找到this

  

拳击和拆箱是C#类型系统中的一个基本概念。使用Boxing和unboxing,可以通过允许将value-type的任何值转换为和,来实现值类型和引用类型之间的链接。   来自类型对象。装箱和拆箱可以实现类型系统的统一视图,其中值为any   类型最终可以被视为一个对象。 将值类型转换为引用类型称为Boxing。拆箱是一项明确的操作

Boxing正在将值类型转换为引用,并且不在您的代码中。所以回答你的“b-boxed”问题是“不”。

答案 2 :(得分:1)

  1. B中的成员没有装箱。
  2. B中的成员位于堆上。它是对象的一部分,对象总是在堆上分配。
  3. A中的b成员未装箱(但可以装箱A值)。
  4. A中的b成员是A的一部分,因此它存储在存储A值的任何地方,可以在堆栈上或堆上。
  5. B中的b成员没有装箱。
  6. B中的b成员位于堆上,作为对象的一部分。

答案 3 :(得分:0)

通过引用传递值类型也不是装箱。

void SomeFunction(ref int a) a没有盒装。

int? value 可以为Nullable值的类型也不加框。

object my_box = my_integer my_value是my_integer的盒装版本

类中包含的值类型没有装箱(如果是这种情况,它何时会是值类型?)

答案 4 :(得分:0)

结构类型的存储位置(变量,参数或字段)包含在其中,该类型的所有字段(公共字段和私有字段)。如果存储位置作为自动变量或参数保存在堆栈上,则其所有字段都是相同的。如果存储位置存在于堆对象中,则其字段将位于相同的堆对象中。

通过为每个值类型定义具有相同名称和成员的类类型,Boxing在内部工作。当为需要类类型的代码提供值类型值时,系统会生成同名类类型的新实例,并将所有字段(public和private)从value-type值复制到新对象实例。尽管C#规范将盒装实例描述为值类型,但其行为和内部工作方式将是类类型。