垃圾回收器何时会收集单例对象?

5

我有一个C#(.NET 3.5)中的SomeSingleton类和以下代码:

foo()
{
    ...
    SomeSingleton.Instance.DoSomething();
    ...
}

我的问题是:何时Garbage Collector会收集这个Singleton对象?
附:SomeSingleton的代码:
    private static SomeSingleton s_Instance = null;
    public static SomeSingleton Instance
    {
        get 
        {
            if (s_Instance == null)
            {
                lock (s_InstanceLock)
                {
                    if (s_Instance == null)
                    {
                        s_Instance = new SomeSingleton();
                    }
                }
            }
            return s_Instance;
        }
    }

感谢您的帮助! < p > < strong > 编辑 (附解释): < p>在Windows服务中,我有以下代码:
   ...
   FirstSingleton.Instance.DoSomething();
   ...

public class FirstSingleton
{
    (Instance part the same as in SomeSingleton)
    public void DoSomething()
    {
        SomeSingleton.Instance.DoSomething();
    }
}

我想要实现的目标是: 我不关心FirstSingleton会发生什么,但在第一次使用SomeSingleton时,它会启动计时器,因此只要我的服务在运行,就需要SomeSingleton存在(以便计时器可以每隔一段时间运行新线程)。
根据你的回答,我理解所有这些都会发生,因为对于我的FirstSingleton和SomeSingleton的引用是静态的,只有当服务停止时,单例才会被GC收集,我是正确的吗? :)

1
我相信这是在应用程序终止时发生的(连同其余静态内容一起)(假设引用未被移除)。 - Sayse
除非您将s_Instance设置为null并且没有任何其他相同的引用,否则它永远不会被垃圾回收。 - Sriram Sakthivel
3
就你的代码而言:永远不会。这对你并不重要。当你担心Dispose(!= collect)时,请问相关问题。 - H H
这个问题在 https://dev59.com/K3RB5IYBdhLWcg3wuZU1#538238 得到了非常完美的回答,其中包含了你需要了解的关于GC和Idisposable接口的所有内容,以及如何在托管和非托管资源中使用两者。但是回答你的问题,不,GC不会释放静态字段。 - Andrew
1
这个问题不是关于 IDisposable,而是关于静态字段何时可以进行回收的。 - Lee
显示剩余2条评论
2个回答

6

1
静态变量引用的对象只有在相关的AppDomain被垃圾回收时才会被垃圾回收。在客户端应用程序中,通常只有一个AppDomain存在于整个进程的生命周期中。(一个例外是当应用程序使用插件架构时 - 不同的插件可能加载在不同的AppDomains中,并且AppDomain可能稍后被卸载。)
参考:Refer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接