如何以及何时处置/垃圾收集单例实例

时间:2012-01-16 08:53:40

标签: c# garbage-collection singleton idisposable code-design

我正在使用从嵌套类创建的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。

1 个答案:

答案 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;
        }
    }
}