VS1*_*VS1 5 c# singleton garbage-collection idisposable code-design
我正在使用从嵌套类创建的Singleton实例.这个实例保存了一些静态集合,这些集合在处理Singleton时被清除,但问题是我得到了对非空闲处理的Singleton的引用,而这些处理没有被正确地垃圾收集.
我想知道WHEN和HOW如何完全处理和垃圾收集我的Singleton实例,以便在dispose(并设置为null)后再次查询实例时,会创建一个新的Instance.
我对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;
}
}
Run Code Online (Sandbox Code Playgroud)
第1行的问题是,在从客户端类处理SingletonClass之后,_collection对象变为null,而SingletonClass实例即使在设置= null之后仍保持非null.
小智 5
System.IDisposable如果您满足以下基本要求,您只需要实施:
此接口的主要用途是释放非托管资源。
然后我会去寻找类的析构函数并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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8772 次 |
| 最近记录: |