2

静态成员与实例无关,而是与类型本身有关。

但我想知道:

如果我有这门课:

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

我当然可以创造new A()

但我的问题是:

  • “卡在”类型本身的静态成员是否会阻止实例被 GC 处理?
4

2 回答 2

10

不必要。静态成员属于类本身,CLR 将其保存为Type对象。如果静态成员是 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();
    }
}

此行为对于某些不一定是单例但确实具有无状态的“默认”行为的类很有用。我使用它的一个例子是ParseTreeWalker.DefaultANTLR 4 项目的 C# 运行时库中的字段。如果您需要默认行为,您可以使用该实例而不创建新对象,但您也可以选择创建自己的类的实例,ParseTreeWalker以添加您自己的行为。

于 2013-05-24T17:45:23.700 回答
2

不,不是的。这可以通过覆盖终结器来轻松显示。

于 2013-05-24T17:45:50.347 回答