存储在堆中的对象中的值类型也是如此?

时间:2011-01-18 18:59:46

标签: c# stack heap-memory

我可以想象这个问题已被问过几千次,但我找不到答案的运气也不多,而且这更多是出于好奇而不是需要。

深入研究C#的细节,我想知道,因为对象存储在堆中,堆中存储的对象中的值类型是否也被放置在堆栈中?

4 个答案:

答案 0 :(得分:9)

Andrew Hare是对的。有关完整详细信息,请参阅Eric Lippert's blog entry

  

我对“值类型进入堆栈”的神话感到不安......通常说错误:语句应该是“值类型可以存储在堆栈中”,而不是更常见的“值”类型总是存储在堆栈中“。

答案 1 :(得分:6)

它们存储在堆中,在为引用类型分配的内存中。另外,value types are often stored in places other than "the stack"。但是,CLI规范没有指定存储值类型的内存池所在的位置 - 这是一个无关紧要的实现细节。

答案 2 :(得分:4)

它们与对象本身一起存储在堆上。考虑这个问题的一个好方法是,当一个对象(其值为类型作为其状态的一部分)在堆上分配时,它的值类型也必须存在于那里,否则这些值类型会在堆栈解除后立即消失用于创建对象的代码。

答案 3 :(得分:1)

是的,它们是作为堆的一部分存储的。然而,正如Eric Lippert多次描述的那样,这都是一个实现细节。我建议你阅读他的博客文章,this是最新版本,these two也很重要。