【问题标题】:When will an object declared in a static class get garbage collected?静态类中声明的对象何时会被垃圾回收?
【发布时间】:2011-03-10 07:53:18
【问题描述】:
 public static class stClass
{
    static Class1 obj = new Class1();

    public static int returnSomething()
    {
        return 0;
    }
}

如果我在其他非静态类中调用静态函数 stClass.returnSomething()stClass 中的 Class1 实例 obj 何时会被垃圾回收?

注意:Class1 不是静态的

【问题讨论】:

    标签: c# static garbage-collection dispose


    【解决方案1】:

    永远不要,因为obj 没有实现IDisposable

    如果您的意思是 obj 什么时候会被垃圾收集,那么答案仍然是永远不会 - 静态字段永远不会被垃圾收集,因此 obj 引用的对象只会有资格进行垃圾收集如果您将 obj 设置为 null(或其他对象)并且没有对该对象的其他引用:

    obj = null;
    

    (或者如果您的应用程序域已卸载/进程结束)

    【讨论】:

    • 关于 IDisposable 的好点,但我怀疑海报的意思是什么时候该对象将被垃圾收集。
    • “只有将 obj 设置为 null 时才会被垃圾回收”——这有点误导。只有当您将 obj 设置为 null 时,该对象才会成为 有资格 进行垃圾收集。实际收集时间不确定。
    【解决方案2】:

    它永远不会被disposed,因为它没有实现 IDisposable。但是它会收集垃圾。当您退出应用程序或销毁创建该类的 AppDomain 时,就会发生这种情况。

    【讨论】:

    • 实际上我认为它不会像垃圾收集器那样被收集。该应用程序将停止,该过程将被丢弃。
    • 似乎我有点误解了这个问题。我以为你在问 stClass 什么时候会被处理掉。对象“obj”将在您显式调用 dispose 或删除对它的所有引用时被释放(即分配 obj = null),它将在垃圾收集之前被释放。
    • TomTom,这是一个有趣的问题。我认为这里的行为会有所不同,具体取决于应用程序是否优雅地结束,应该很容易测试。显然,如果你杀死它,内存将不会被垃圾收集。
    【解决方案3】:

    如果 Class1 实现了 IDisposable 接口并具有终结器,则运行时将在卸载 appdomain 时尝试调用终结器*。如果 Class1 正确地遵循 dispose pattern,则终结器应调用 dispose(false)。这将是卸载 Class1 实例正在使用的任何非托管资源的正确时间。

    但是,在处理使用非托管资源的对象时,您应该努力对对象生命周期进行更多控制,而不是让终结器在 appdomain 关闭时运行。

    *即使是终结器也不能保证在应用关闭时被调用..

    【讨论】:

      猜你喜欢
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多