C# 静态类中声明的对象何时会被垃圾回收?

C# 静态类中声明的对象何时会被垃圾回收?,c#,static,garbage-collection,dispose,C#,Static,Garbage Collection,Dispose,如果我在其他一些非静态类中调用静态函数stClass.returnSomething(),那么stClass中的Class1实例obj何时会被垃圾回收 注意:Class1不是静态的,因为obj没有实现IDisposable 如果您的意思是何时将objget垃圾收集,那么答案仍然是从不-静态字段从不垃圾收集,因此obj引用的对象只有在将obj设置为null(或其他对象)时才有资格进行垃圾收集并且没有对该对象的其他引用: public static class stClass { stat

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


注意:
Class1
不是静态的,因为
obj
没有实现
IDisposable

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

 public static class stClass
{
    static Class1 obj = new Class1();

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

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

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

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

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


*即使是终结器也不能保证在应用程序关闭时调用。

关于IDisposable的观点很好,但我怀疑海报的意思是当对象将被垃圾收集时。“只有将obj设置为null时才会被垃圾收集”-这有点误导。只有当您将obj设置为null时,对象才有资格进行垃圾收集。收集的实际时间是不确定的。实际上我不认为它会像每个垃圾收集器那样被收集。应用程序将停止,进程将被丢弃。似乎我有点误解了这个问题。我以为你在问我们班什么时候会被处理掉。对象“obj”将在您显式调用dispose或删除对它的所有引用(即assign obj=null)时被释放,它将在垃圾收集之前被释放。TomTom,这是一个有趣的问题。我认为根据应用程序是否优雅地结束,这里的行为会有所不同,应该很容易测试。显然,如果你杀死它,内存将不会被垃圾收集。
obj = null;