C# 垃圾收集器是否回收值类型内存

C# 垃圾收集器是否回收值类型内存,c#,asp.net,garbage-collection,C#,Asp.net,Garbage Collection,当我声明inta=0时因为它是值类型,所以它从堆栈中获取内存,所以当这个变量超出范围时,垃圾收集器会回收这个内存吗 当我声明int a=0时;因为它是值类型,所以它从堆栈中获取内存 这是正确的——假设局部变量是短期的——但逻辑是错误的。当您声明任何短期的本地内存时,它从短期内存池(可能是堆栈,也可能是寄存器)获取内存。它从短期池获取内存,而不管它是值类型还是对引用类型对象的引用。无论哪种方式,如果变量是短期的,内存都会在短期池中分配 也就是说,当你有一个短暂的本地 object x = null

当我声明
inta=0时因为它是值类型,所以它从堆栈中获取内存,所以当这个变量超出范围时,垃圾收集器会回收这个内存吗

当我声明int a=0时;因为它是值类型,所以它从堆栈中获取内存

这是正确的——假设局部变量是短期的——但逻辑是错误的。当您声明任何短期的本地内存时,它从短期内存池(可能是堆栈,也可能是寄存器)获取内存。它从短期池获取内存,而不管它是值类型还是对引用类型对象的引用。无论哪种方式,如果变量是短期的,内存都会在短期池中分配

也就是说,当你有一个短暂的本地

object x = null;
对象引用的存储在短期池中分配。引用对象的存储(如果有)分配在长期池(堆)上。在这种情况下,引用为null

当此变量超出范围时,垃圾收集器是否回收此内存

不会。垃圾收集器只收集在长期池(也称为堆)上分配的内存

垃圾收集器当然必须知道短期池;如果短期资金池中有参考资料,那么这些参考资料可能是指活的东西。但是垃圾收集器可以安全地忽略短期池中不包含引用的所有值类型


你为什么要问这个问题?我怀疑这里隐藏了一个更深层次的问题。

当然它被标记为垃圾收集,但不一定是在那一点上实际垃圾收集?您应该阅读Eric Lippert的文章。这里的第一个错误是您假设int a=0;是由CG收集的-也许你的问题是任何数据到CG。。。或者函数中的int值会发生什么情况?Eric,正是我所寻找的,仍然(相关),在阅读你的文章时,你说——查看堆栈,将指针向上移动1步——非常简单和便宜——因此我们尽可能地使用它。但是那些引用长寿命对象的值类型呢?这不影响扫描部件的性能吗?我的意思是,如果一个
pop()
不能
pop()
它怎么办?因为它引用的是堆中的一个长期存在的对象…@RoyiNamir:你把它倒过来了。你说过不能弹出堆栈,因为堆栈引用了一些活动的内容,但事实恰恰相反。该对象是活动的,因为它被堆栈引用。当堆栈被弹出时,必须有其他东西使引用的对象保持活动状态;如果没有,那它就死了。