我知道引用类型有垃圾收集,但我想知道垃圾收集如何适用于值类型。
当值类型超出范围时,是否会收集垃圾?
答案 0 :(得分:10)
只有堆上分配的存储必须进行垃圾回收。
如果值类型变量在堆上,它或者是其他类的一部分,或者是一个盒装值,它是仅包含值类型值的对象。该值是内存的一部分,当包含对象被垃圾收集时,该内存被“释放”。
如果值类型变量在堆栈上,当返回的方法弹出堆栈帧时,它使用的内存将被有效“释放”。
请注意,最终在堆栈上的内容以及最终在堆上的内容是implementation detail,这会因捕获的变量,迭代器块,异步方法,ref参数等而变得更加复杂。但是广泛的原则是用于值类型值的内存总是“其他东西”的一部分 - 所以当回收“其他东西”的内存时它会被回收。 (这不是某种单独的步骤 - 无论是对象还是堆栈框架,值都存在于内存中“其他东西”。)
答案 1 :(得分:-1)
值类型存储在堆栈中。这意味着,该运行时将指针保持在每个方法的堆栈顶部,当您从方法返回时,此顶部将向下移动。使此方法中声明的任何变量超出范围。
对于类字段,它们存储在具体类的内存中,并作为类本身的一部分进行垃圾收集。