存储的引用类型(堆或堆栈)中定义的值类型在哪里?

时间:2010-06-10 04:40:09

标签: .net value-type reference-type

在引用类型中定义的值类型是存储在堆上还是堆栈上?

  1. 如果存储在堆上,那么什么时候值类型存储在堆栈上?
  2. 如果存储在堆栈中,那么堆内部会发生什么,因为最终所有内容都以值类型结束?

3 个答案:

答案 0 :(得分:3)

存储在堆栈中的唯一变量是函数的局部变量。对于引用类型,引用存储在堆栈中,而引用的对象存储在堆上。对于值类型,对象本身存储在堆栈中。请注意,可以从本地函数中转义的局部变量(例如通过闭包)存储在堆上的单独数据结构中,包括可能包含的任何值类型。

换句话说,由于引用类型总是存储在堆上,因此它们包含的任何内容(甚至是值类型)也都存储在堆上。

答案 1 :(得分:2)

答案 2 :(得分:1)

引自here

  

每个局部变量(即一个声明的变量)   在方法中)存储在堆栈中。   这包括引用类型变量    - 变量本身在堆栈上,但要记住a的值   引用类型变量只是一个   引用(或null),而不是对象   本身。方法参数计为   局部变量也是如此,但如果是的话   用ref修饰符声明它们   不要得到自己的插槽,但分享一个   插槽中使用的变量   调用代码

我想像TextBox txtbx = new TextBox();之类的东西意味着变量txtbx存在于堆栈中,但它的值通常是对堆上对象的引用。

  

引用类型的实例变量始终在堆上。这就是物体本身“存在”的地方。