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

7

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

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

1
我建议阅读《CLR via C#》或《C#深入浅出》,并仔细阅读相关章节。这不是一个简单的话题。 - Gishu
也可能是 https://dev59.com/g0jSa4cB1Zd3GeqPFW8_ 的重复问题。 - Gishu
3个回答

5
在堆栈中,唯一存储的变量是函数的本地变量。对于引用类型,引用存储在堆栈上,而它所引用的对象存储在堆上。对于值类型,对象本身存储在堆栈上。请注意,可以从本地函数中逃逸的本地变量(例如通过闭包)存储在堆上的单独数据结构中,包括可能包含的任何值类型。
换句话说,由于引用类型始终存储在堆上,因此它们包含的任何内容(甚至值类型)也存储在堆上。

2

这实际上并没有直接回答他的问题。 - Adam Robinson
@Adam Robinson - 你说得对,谢谢。我需要更仔细地阅读问题。 - bniwredyc

1

引用自此处

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

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

引用类型的实例变量始终在堆上。那就是对象本身 "存在" 的地方。


直到现在,我才意识到此刻对这篇帖子的两个回答指向同一篇文章。 :| - deostroll
+1,不过你最后一句话(实际回答问题的部分)可能应该放在首位 - Adam Robinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接