静态成员是否阻止实例类进行GC操作?

时间:2013-05-24 17:42:54

标签: c# .net static garbage-collection

静态成员不是关于实例而是关于类型本身。

但我想知道:

如果我有这门课程:

public class A
{
 ...
 public static int MyInt{get;set;}
 ...
}

我可以创建new A()

但我的问题是:

  • 是否“粘贴”在类型本身上的静态成员是否会阻止实例进行GC操作?

2 个答案:

答案 0 :(得分:10)

不一定。静态成员属于类本身,CLR将其保留为Type对象。如果静态成员是A类型的对象,则静态成员可以使特定 A实例不被垃圾回收。

public class Example
{
    // this particular instance of Example will not be collected
    private static readonly Example Default = new Example();

    public void Foo()
    {
         // this instance *can* be collected after Foo returns
         Example anotherInstance = new Example();
    }
}

此行为对于某些类非常有用,这些类不一定是单例,但具有无状态的“默认”行为。我使用它的一个例子是ANTLR 4项目的C#运行时库中的ParseTreeWalker.Default字段。如果您需要默认行为,则可以在不创建新对象的情况下使用该实例,但您也可以选择创建自己的扩展ParseTreeWalker类的实例来添加自己的行为。

答案 1 :(得分:2)

不,它没有。通过覆盖终结器可以很容易地显示出来。