【发布时间】:2013-08-19 12:37:20
【问题描述】:
我有一些 C# 中的 SomeSingleton 类(如果重要的话是 .NET 3.5)和代码:
foo()
{
...
SomeSingleton.Instance.DoSomething();
...
}
我的问题是:Garbage Collector 什么时候会收集这个 Singleton 对象?
ps: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;
}
}
感谢您的帮助!
编辑(附解释):
在 Widnows 服务中我有代码:
...
FirstSingleton.Instance.DoSomething();
...
public class FirstSingleton
{
(Instance part the same as in SomeSingleton)
public void DoSomething()
{
SomeSingleton.Instance.DoSomething();
}
}
我想要实现的目标: 我不关心 FirstSingleton 会发生什么,但是 SomeSingleton 会在第一次使用它时启动 Timer,所以只要我的服务正在运行,我就需要 SomeSingleton 存在(因此计时器可以在每个时间段运行新线程)。
据我所知,所有这些都会发生,因为对我的 FirstSingleton 和 SomeSingleton 的引用是静态的,在服务停止之前,GC 不会收集单例,对吗? :)
【问题讨论】:
-
我相信它是在应用程序终止时(以及其他静态数据)(假设没有删除引用)
-
除非您将
s_Instance设置为null并且您没有任何其他相同的引用,否则它永远不会被垃圾收集 -
就您的代码而言:从不。这对你来说应该无关紧要。当您担心 Dispose (!= collect) 时,请询问。
-
这已经在stackoverflow.com/a/538238/1856345 得到了非常完美的回答,它包含您需要了解的关于 GC 和 Idisposable 接口的所有信息,如何在托管和非托管资源中使用编辑:但回答您的问题,没有 GC不会释放静态字段
-
这个问题不是关于
IDisposable,而是关于静态字段何时可以被收集。
标签: c# .net garbage-collection singleton