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

本文关键字:类型 字段 引用类型 | 更新日期: 2023-09-27 18:10:39

有代码:

struct A
{
   int b;
}
class B
{
  A a;
  int b;
}

问题是:

  1. a在B中是否有框?
  2. B中的a位于堆栈中还是在堆中?
  3. b在A中是否有框?
  4. b在堆栈中还是在堆中?
  5. b是否在b中?
  6. b在b堆栈中还是在堆中?
(

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

)

1)不,这里没有拳击。

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

3)不,A中的b未装箱

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

5) B中的b也没有装箱

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

这里没有装箱,因为您没有显示任何试图使用值类型值作为引用类型值的内容(例如object或接口)。

同样,整个堆栈/堆的区别是一个实现细节。你应该看看Eric Lippert关于这个话题的博客文章。

使用Google我发现了这个:

装箱和拆箱是c#类型系统中的一个基本概念。通过装箱和拆箱,可以将值类型的任何值转换为和,从而在值类型和引用类型之间建立链接从类型对象。装箱和拆箱可以实现类型系统的统一视图,其中任何值都可以类型最终可以被视为对象。将值类型转换为引用类型称为装箱。拆箱是显式操作。

装箱是将值类型转换为引用,这不在您的代码中。所以你的b框问题的答案是否定的

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

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

void SomeFunction(ref int a)A未装箱

int? value可空值类型也不装箱。

object my_box = my_integerMy_value是my_integer

的盒装版本

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

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

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