存储类中的值类型在哪里?

时间:2011-07-25 21:02:31

标签: c# .net

  

可能重复:
  Fields of class, are they stored in the stack or heap?

如果我有

Class A
{
    int k=0;
}

我在做:

A x  = new A();

k存储在哪里?在堆或堆栈上?为什么?

3 个答案:

答案 0 :(得分:6)

即使k是一个值为类型的int,它在引用类型中包含,因此它将作为为{{分配的内存的一部分存储在堆上。 1}} - 虽然这是一个实现细节,但这是.NET的当前行为。

答案 1 :(得分:4)

没有明确的答案。 CLR没有定义是将对象放在堆栈还是堆上。

有关详细信息,请阅读Eric Lippert的blog posts

答案 2 :(得分:2)

它(可能 - 见下文)存储在堆上,以及类的所有其余数据。

它没有存储在堆栈中,因为将它放在那里并没有任何意义。由于该值是引用类型的一部分,因此即使在当前过程退出后它仍继续存在。但是,如果它在堆栈上,那么在弹出堆栈帧后它将被删除。这会使对象无效,除非有一些真正具有纪念意义的额外工作继续尝试并在堆栈中上下移动以保持它活着。

此外,堆栈是一个很小的空间,并且在代码中创建的每个值类型的每个实例都会导致它非常非常快地耗尽空间。

但是,最正确的答案是存储数据的位置是一个实现细节,因此您应该假设您没有(也不能)知道。引用和值类型之间的真正区别在于它们的名称内置:对于值类型,诸如赋值和作为参数传递的操作会导致复制对象的值。对于引用类型,此类操作会创建对原始对象的附加引用。