2

System.ValueType 是一个
但所有值类型都是结构。

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

System.ValueType foo = 5;

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

4

5 回答 5

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"

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

于 2012-09-20T08:28:16.607 回答
3

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

值类型要么是堆栈分配的,要么是在结构中内联分配的。引用类型是堆分配的。引用类型和值类型都派生自最终的基类 Object。如果值类型必须表现得像对象,则在堆上分配一个使值类型看起来像引用对象的包装器,并将值类型的值复制到其中。

于 2012-09-20T08:20:08.140 回答
2

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

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

于 2012-09-20T08:20:01.717 回答
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. 它是不完整的。参考文献呢?引用既不是值类型也不是引用类型的实例,但它们是值。它们必须存放在某个地方。它们是在堆栈上还是在堆上?为什么从来没有人谈论它们?没有理由仅仅因为它们在 C# 类型系统中没有类型而忽略它们。

于 2012-09-20T08:20:28.317 回答
2
于 2012-09-20T08:22:06.127 回答