结构是否可用于垃圾回收
本文关键字:用于 是否 结构 | 更新日期: 2023-09-27 17:50:58
struct a
{
public string str;
}
a bb = new a();
class a
{
public string str;
}
a bb = new a();
说类总是垃圾回收是正确的吗?结构是否(永远(保存在内存中?
编辑 -> 在讨论评论后更新了答案,以及 Rob 共享的链接
struct
是值类型。通常不会在堆上为它们分配单独的内存。通常不需要垃圾收集。
但是也有例外。不保证内存分配是为值类型分配堆栈或为引用类型分配堆。有关详细信息,请阅读其他 SO 问题的回答和实现详细信息中的堆栈。
如果struct
将某个引用类型作为成员变量,则一旦引用类型超出范围struct
,引用类型将被垃圾回收(在下一个垃圾回收触发器中(,并且引用类型没有更多可访问的根。
如果您的示例,您已使用 string
作为引用类型。 使用实习生池处理String
的方式不同。
是的。如果struct
是引用类型对象的字段,则它存储在堆中,则受垃圾回收
如果您的问题是字符串是否会保留在结构示例中的内存中,答案是否定的。结构的成员在离开作用域时会受到垃圾回收,就像任何其他对象一样。
.NET GC 使用标记和扫描方法,其中检查由静态字段、现有对象和堆栈上的局部变量等指向的对象。
由于局部变量中的结构位于堆栈上,因此它们会正常扫描。当 GC 通过对象树时,堆上对象成员中的结构也会被扫描。静态成员也是如此。
简而言之,结构的扫描方式与类相同。它们之间的唯一区别是它们的存储方式。结构按变量存储,而类存储为引用。这两种方式都受 GC 的约束。
如果我没知道的话,是的,在 C# 中它们都是垃圾回收。
存储在堆中还是堆栈中取决于变量/实例的生存期,而不是类型。
要考虑的一件事是,当更复杂的情况(如订阅的事件处理程序(驻留在类的实例中时,在这种情况下,垃圾回收器可以跳过收集,实例可以驻留在内存中。 但是可能会收集上述示例,因为只声明了一种字符串类型。