是堆或堆栈上的System.ValueType实例?

时间:2012-09-20 08:17:22

标签: c# oop class memory-management

System.ValueType是class
但所有价值类型都是结构。

如果我像这样创建一个ValueType实例:

System.ValueType foo = 5;

...是保存在堆上还是堆栈上?

5 个答案:

答案 0 :(得分:4)

System.ValueType 不是值类型。值类型是ValueType继承的内容,但不是ValueType本身。所以:

System.ValueType foo = 5; 

这里,5被加载到堆栈中。然后将盒装(带有int类型的框)放到堆上。然后将对象引用分配给引用foo。我们可以通过查看IL来看到这一点:

ldc.i4.5 // push int32 value 5 onto the stack
box int32 // box the value at the top of the stack, type int32
stloc.0 // assign to "foo"

一般情况下,结构可以在堆栈上的 ,具体取决于上下文。坦率地说,哪个都没关系 - 因为两者都是实现细节。重要的是行为 ......并且(至少在他们的未装箱形式中),关于结构的关键点是它们的分配复制语义。

答案 1 :(得分:3)

我想说如果您查看System.Valuetype的MSDN页面,您会找到答案:

  

值类型 堆栈分配或内联分配   结构体。 引用类型是堆分配的。引用和   值类型派生自最终的基类Object。在案件   值类型必须像对象一样运行,a   使值类型看起来像引用对象的包装器   在堆上分配,并将值类型的值复制到其中。

答案 2 :(得分:2)

  

数据类型分为值类型和引用类型。值类型是堆栈分配或在结构中内联分配。引用类型是堆分配的。

来源:http://msdn.microsoft.com/en-us/library/system.valuetype.aspx

答案 3 :(得分:2)

所有值类型都可以存储在堆栈中(是的,我可以这么说)但并不总是如此,无论如何,偶数值类型从对象继承的这个部分只是因为.NET框架的构建方式而需要的异常,这也允许保留完美的树状结构。

有关更高级的解释,您可以查看Eric Lippert的博客。

http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx

作为Eric Lippert博客的一个副本:

  
      
  1. 通常说错误:语句应该是“值类型可以存储在堆栈中”,而不是更常见的“值类型总是存储在堆栈中”。

  2.   
  3. 这几乎总是无关紧要的。我们努力创建一个托管环境,在这种环境中,不同类型的存储之间的区别对用户是隐藏的。与某些语言不同,为了正确起见,您必须知道特定存储是在堆栈还是堆中。

  4.   
  5. 不完整。参考怎么样?引用既不是值类型也不是引用类型的实例,但它们是值。他们必须存放在某个地方。他们是在堆栈还是堆上?为什么没有人谈论过它们?仅仅因为它们在C#类型系统中没有类型就没有理由忽略它们。

  6.   

答案 4 :(得分:2)

This post讨论了存储价值类型的位置。

  

过去的方式我通常会推翻这个神话,就是说真正的声明应该是“在桌面CLR上的C#的Microsoft实现中,值类型存储在堆栈上时value是局部变量或临时值,不是lambda或匿名方法的闭合局部变量,方法体不是迭代器块,抖动选择不注册该值。“

This series of posts谈到为什么你不应该真正关心。

  

关于值类型最相关的事实当然不是如何分配的实现细节,而是“值类型”的按设计的语义含义,即他们总是被“按价值”复制。如果相关的事情是他们的分配细节,那么我们称他们为“堆类型”和“堆栈类型”。但这在大多数时候都不相关。大多数时候,相关的事情是他们的复制和身份语义。