是否收集垃圾价值类型?

是否收集垃圾价值类型?

问题描述:

我明白有引用类型的垃圾回收,但我想知道垃圾回收如何处理值类型。是否收集垃圾价值类型?

值类型在超出范围时是否会收集垃圾?

+0

可能重复的[值类型获取垃圾收集?](http ://*.com/questions/2342772/do-value-types-get-garbage-collected) – nawfal

值类型存储在堆栈上。这意味着,运行时会将指针指向每个方法的堆栈顶部,并且当您从方法返回时,此顶部将向下移动。使此方法中声明的任何变量超出范围。

对于类字段,这些字段被存储在具体类的内存中,并作为类本身的一部分进行垃圾收集。

+0

-1并非所有的值类型都在堆栈中。 –

+0

我们正在根据“何时值类型的变量超出范围”来讨论方法中的局部变量。所有这些都存储在堆栈中。 – Euphoric

+0

@Euphoric:并非所有变量都是参数。 OP没有具体询问参数;有多种其他方式可以使变量超出范围。 –

只有存储分配在必须被垃圾收集。

如果一个值类型变量是在堆上,它的一些其它类的任一部分,或者装箱值,这是其中仅包含值类型值的对象。该值是包含垃圾收集对象时“释放”的内存的一部分。

如果一个值类型变量位于堆栈上,当堆栈框架被返回的方法弹出时,它使用的内存将被有效“释放”。

请注意,什么最终在堆栈上,什么最终在堆上是一个implementation detail这是由捕获的变量,迭代块,异步方法,ref参数等更复杂。但广泛的原则是,使用的内存对于值类型值始终是“别的东西”的一部分 - 所以当回收那个“别的东西”的内存时它会被回收。 (这不是某种单独的步骤 - 无论是对象还是堆栈帧,该值都存储在内存中“其他”)。