我正在使用从嵌套类创建的Singleton实例。这个实例保存了一些静态集合,这些静态集合在处理Singleton时被清除,但问题是我得到了一个非空的处理Singleton的引用,它没有被正确地垃圾收集。
我想知道WHEN以及如何完全处理和垃圾收集我的Singleton实例,以便在dispose(并设置为null)后再次查询实例时,会创建一个新的实例。
我对Singleton实例使用以下嵌套模式:
public class SingletonClass : IDisposable
{
private List<string> _collection;
private SingletonClass()
{
}
public static SingletonClass Instance
{
get
{
return Nested.Instance; //line 1 - this line returns the non-null instance after dispose and setting the Singleton instance to null which is causing problems
}
}
private void Init()
{
_collection = new List<string>();
//Add data to above collection
}
public void Dispose()
{
//Release collection
_collection.Clear();
_collection = null;
}
class Nested
{
static Nested()
{
Instance = new SingletonClass();
Instance.Init();
}
internal static readonly SingletonClass Instance;
}
}
第1行的问题是,在从客户端类处理SingletonClass之后,_collection对象变为null,而SingletonClass实例即使在设置= null之后仍保持非null。
答案 0 :(得分:4)
如果您满足以下基本要求,您只需要实施System.IDisposable
:
此接口的主要用途是释放非托管资源。
然后我会去找班级的析构函数并在example中拨打Dispose()
。
否则
垃圾收集器自动释放分配给的内存 不再使用该对象时的托管对象。
(除非流程结束,否则不会出现真正的单身人士的情况)
如果你正在使用这样的话,你可能会变得更好
class PseudoSingleton<T>
where T : new()
{
private readonly object _lock = new object();
private T _instance;
public T Instance
{
get
{
lock (this._lock)
{
if (this._instance != null)
{
this._instance = new T();
}
return this._instance;
}
}
}
public void Reset()
{
lock (this._lock)
{
this._instance = null;
}
}
}