结构是否可用于垃圾回收

本文关键字:用于 是否 结构 | 更新日期: 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# 中它们都是垃圾回收。

存储在堆中还是堆栈中取决于变量/实例的生存期,而不是类型。

要考虑的一件事是,当更复杂的情况(如订阅的事件处理程序(驻留在类的实例中时,在这种情况下,垃圾回收器可以跳过收集,实例可以驻留在内存中。 但是可能会收集上述示例,因为只声明了一种字符串类型。