如何以及何时处置/垃圾收集单例实例
我正在使用从嵌套类创建的Singleton实例。 这个实例保存了一些静态集合,这些集合在处理Singleton时被清除,但问题是我得到了对非null处理的Singleton的引用,它没有正确地进行垃圾回收。
我想知道WHEN以及如何完全处理和垃圾收集我的Singleton实例,以便在dispose(并设置为null)后再次查询实例时,会创建一个新实例。
我对Singleton实例使用以下嵌套模式:
public class SingletonClass : IDisposable { private List _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(); //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。
如果您满足以下基本要求,则只需要实现System.IDisposable
:
此接口的主要用途是释放非托管资源。
然后我会选择类的析构函数并在示例中调用Dispose()
。
除此以外
当不再使用该对象时,垃圾收集器会自动释放分配给托管对象的内存。
(除非过程结束,否则不会出现真正的单例)
如果你正在使用这样的话,你可能会更好
class PseudoSingleton 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; } } }
- WPF – 使用鼠标事件在canvas上绘图
- 如何在构建动态LINQ表达式时检测IsNull / NotNull?
- 如何从C#.NET 4.5中的zip存档中提取特定目录?
- C#可以存储比双精度更精确的数据吗?
- 为什么C#和VB.NET以不同的方式隐式编组char *?
- 访问HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Installer \ UserData
- 为什么microsoft没有为stringbuilder重载+ =运算符?
- Json.NET按深度和属性序列化
- 将SQL查询转换为LINQ to Entities Lambda Expression