struct a
{
public string str;
}
a bb = new a();
class a
{
public string str;
}
a bb = new a();
说类总是被垃圾收集是否正确?结构是否保存在内存中(永远)?
struct a
{
public string str;
}
a bb = new a();
class a
{
public string str;
}
a bb = new a();
说类总是被垃圾收集是否正确?结构是否保存在内存中(永远)?
是的。如果struct
是引用类型的对象的字段,则存储在堆中,然后进行垃圾回收
如果您的问题是字符串是否会在 struct 示例中保留在内存中,那么答案是否定的。结构的成员在离开作用域时会受到垃圾回收,就像任何其他对象一样。
.NET GC 使用标记和清除方法,它检查静态字段指向的对象、现有对象和堆栈上的局部变量等。
由于局部变量中的结构位于堆栈上,因此它们被正常扫描。当 GC 遍历对象树时,堆上对象成员中的结构也会被扫描。静态成员也是如此。
简而言之,结构的扫描方式与类相同。它们之间的唯一区别是它们的存储方式。结构是按变量存储的,而类是作为引用存储的。两种方式均受 GC 约束。
如果我没记错的话,是的,在 C# 中它们都是垃圾收集器。
是否存储在堆或堆栈中取决于变量/实例的生命周期而不是类型。
需要考虑的一件事是,当订阅事件处理程序等更复杂的情况驻留在类的实例中时,在这种情况下,垃圾收集器可以跳过收集,而实例可以驻留在内存中。但是由于只声明了一种字符串类型,因此可能会收集上面的示例。