readonly修饰符对垃圾收集器有影响吗?

时间:2010-11-23 18:41:56

标签: c# garbage-collection readonly

readonly修饰符是否可能影响垃圾收集器的工作? 对于值类型,对于引用类型?

3 个答案:

答案 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