【问题标题】:Does static members prevent the instance class from being GC'ed?静态成员是否会阻止实例类被 GC 处理?
【发布时间】:2013-05-24 17:42:53
【问题描述】:

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

但我想知道:

如果我有这门课:

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

我当然可以创建new A()

但我的问题是:

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

【问题讨论】:

    标签: c# .net static garbage-collection


    【解决方案1】:

    不一定。静态成员属于类本身,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 以添加您自己的行为。

    【讨论】:

      【解决方案2】:

      不,它没有。这可以通过覆盖终结器轻松显示。

      【讨论】:

      • 对建议一个测试用例投了赞成票。也许可以使用代码示例。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-02
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多