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;