readonly修饰符是否可能影响垃圾收集器的工作? 对于值类型,对于引用类型?
答案 0 :(得分:6)
不,不。 GC通过回收内存来查找无法从任何有根对象访问的对象。 readonly修饰符对此过程没有影响。除了具有少量只读字段的两个对象图之外,将以相同的方式收集两个对象图。
答案 1 :(得分:1)
我不明白为什么它会影响正常使用的GC。这只是一个领域。 GC简单地遵循引用类型字段(或结构字段中包含的引用)。
您可能能够构建影响GC的人工场景(可能滥用只读字段的防御性副本),但在正常使用情况下不会发生。
当然,你不能在像Dispose
这样的方法中将字段设置为null,如果你想让昂贵的拥有对象为GC准备好,而某些东西包含对包含对象的引用,那么这可能很有用。 / p>
因readonly
此程序显示只是将字段从非readonly更改为readonly可以防止使用其他相同代码收集对象。它滥用了readonly字段被复制到方法调用上以在可写结构中将Obj字段设置为null并将引用保留在readonly结构中。由于它可以防止引用变为空,因此可以防止对象被收集。
但是这当然不会影响GC本身。但是反而滥用readonly的语义,用readonly创建一个不同的对象图。所以Jared的陈述仍然完全正确。
struct EvilStruct
{
public readonly object Obj;
public void SetToNull()
{
this=new EvilStruct();
}
public EvilStruct(object obj)
{
Obj=obj;
}
}
readonly EvilStruct s1=new EvilStruct(new object());
EvilStruct s2=new EvilStruct(new object());
void Main()
{
s1.SetToNull();
s2.SetToNull();
s1.Obj.Dump();//An instance of System.Object
s2.Obj.Dump();//null
//now s1.Obj can't be collected, but what was once in s2.Obj can
}
答案 2 :(得分:0)
readonly
是一个C#功能。 GC是CLI功能。因此,它只是无法影响GC 。