结构可用于垃圾收集吗?

时间:2013-01-08 17:34:02

标签: c# c#-4.0 garbage-collection c#-3.0

struct a
{
   public string str;
}

a bb = new a();

class a
{
   public string str;
}

a bb = new a();

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

4 个答案:

答案 0 :(得分:3)

是。如果struct是引用类型对象的字段,那么它将存储在堆中,然后它将受垃圾收集

的影响

答案 1 :(得分:2)

编辑 - >在对评论进行讨论后回答更新,以及Rob分享的链接

structvalue types。通常在堆上没有为它们分配单独的内存。通常不需要垃圾收集。

但有例外。内存分配不保证为值类型分配堆栈或为引用类型分配堆。请阅读this answerother SO questionThe Stack in An Implementation Detail了解详细信息。

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

如果您的示例,您使用string作为reference type。使用intern pool以不同方式处理String

答案 2 :(得分:1)

如果你的问题是字符串是否会在结构示例中保留在内存中,答案是否定的。结构体的成员在离开范围时会受到垃圾收集,就像任何其他对象一样。

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

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

简而言之,结构以与类相同的方式被扫描。它们之间的唯一区别是它们的存储方式。结构存储在每个变量中,而类存储为引用。这两种方式都适用于GC。

答案 3 :(得分:0)

如果我知道的话,在C#中是的,它们都是Garbage Collected。

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

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