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

问题描述 投票:4回答:3

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

  1. 如果存储在堆上,那么何时将值类型存储在堆栈中?
  2. 如果存储在堆栈中,那么堆内部会发生什么,因为最终所有内容都以值类型结束?
.net value-type reference-type
3个回答

3
投票

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

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


1
投票

引自here

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.