1
struct a
{
   public string str;
}

a bb = new a();

class a
{
   public string str;
}

a bb = new a();

说类总是被垃圾收集是否正确?结构是否保存在内存中(永远)?

4

4 回答 4

4

是的。如果struct是引用类型的对象的字段,则存储在堆中,然后进行垃圾回收

于 2013-01-08T17:37:09.343 回答
4

编辑-> 回答更新后的评论讨论,以及 Rob 共享的链接

struct值类型。通常不会在堆上为它们分配单独的内存。通常不需要垃圾收集。

然而也有例外。内存分配不保证为值类型分配堆栈或为引用类型分配堆。阅读其他 SO 问题的答案和实现细节中的堆栈以获取详细信息。

如果有一些引用类型作为成员变量,那么一旦超出范围,struct引用类型将被垃圾收集(在下一个垃圾收集触发器中)并且引用类型没有更多可访问的根。struct

如果您的示例,您已用作string参考类型String使用实习池以不同方式处理。

于 2013-01-08T17:38:13.657 回答
2

如果您的问题是字符串是否会在 struct 示例中保留在内存中,那么答案是否定的。结构的成员在离开作用域时会受到垃圾回收,就像任何其他对象一样。

.NET GC 使用标记和清除方法,它检查静态字段指向的对象、现有对象和堆栈上的局部变量等。

由于局部变量中的结构位于堆栈上,因此它们被正常扫描。当 GC 遍历对象树时,堆上对象成员中的结构也会被扫描。静态成员也是如此。

简而言之,结构的扫描方式与类相同。它们之间的唯一区别是它们的存储方式。结构是按变量存储的,而类是作为引用存储的。两种方式均受 GC 约束。

于 2013-01-08T17:47:28.730 回答
0

如果我没记错的话,是的,在 C# 中它们都是垃圾收集器。

是否存储在堆或堆栈中取决于变量/实例的生命周期而不是类型。

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

于 2013-01-08T17:49:13.427 回答