5

ネストされたクラスから作成された Singleton インスタンスを使用しています。このインスタンスは、Singleton が破棄されるときにクリアされるいくつかの静的コレクションを保持しますが、適切にガベージ コレクションされていない null 以外の破棄された Singleton への参照を取得することが問題です。

シングルトン インスタンスを完全に破棄してガベージ コレクションを行うタイミングと方法を知りたいので、破棄 (および 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 のままになることです。

4

1 に答える 1

6

System.IDisposable次の基本的な要件を満たす場合にのみ実装する必要があります。

このインターフェイスの主な用途は、管理されていないリソースを解放することです。

次に、クラスのデストラクタを探しDispose()て、exampleを呼び出します。

さもないと

ガベージ コレクターは、管理対象オブジェクトが使用されなくなると、そのオブジェクトに割り当てられたメモリを自動的に解放します。

(プロセスが終了しない限り、実際のシングルトンには当てはまりません)

このようにsthを使用している場合は、より良いかもしれません

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;
        }
    }
}
于 2012-01-16T08:57:04.797 に答える