2

カスタム タイプと、要求に応じてタイプのオブジェクトを作成MyClassするファクトリ クラスがあります。FactoryMyClass

オブジェクトの作成にはコストがかかり、同じオブジェクトを複数回作成するように要求される場合があるFactoryため、作成されたオブジェクトはディクショナリに格納されます。同じタグを持つ各オブジェクトは、一度だけ作成する必要があります。

class MyObject
{
    // .. not important
}

class Factory
{
    private Dictionary<int, MyObject> m_objects = new Dictionary<int, MyObject>();

    public MyObject CreateObject(int tag, params object[] parameters)
    {
        MyObject obj;
        if (!m_objects.TryGetValue(tag, out obj))
        {
            obj = new MyObject();
            // .. some initialization
            m_objects.Add(tag, obj);
        }

        return obj;
    }
}

オブジェクトは、不明な期間、外部のどこかに保管されている場合と保管されていない場合があります。 Factoryオブジェクトは作成後に変更される場合があります。Factoryオブジェクトへの参照を格納し、そのオブジェクトが他の場所に格納されていない場合があります。

今、私はガベージコレクターにその仕事をさせたいと思っています。外部Factoryに保存されておらず、変更されていないオブジェクトを収集したい。

私の最初の考えは、辞書内の値に弱い参照を使用することでしたFactoryが、このアプローチは「変更され参照されていない」ケースを処理しないようです。

作成したオブジェクトを辞書に保存する方法は次のとおりです。

  • ガベージコレクションされる可能性があります
  • 参照せずに変更するとガベージコレクションされませんか?
4

1 に答える 1

4

CodesInChaos の回答を拡張すると、元の弱い参照を使用して正しい方向に進んでいると思いますDictionary.2番目のデータ構造を使用することは理にかなっていると思いますHashSet.かわった。

オブジェクトへの参照を保存するのは安価であることを覚えておいてください。それが懸念されるようになる前に、数百万または数十億の参照が必要になると思います。

于 2012-08-29T18:07:12.510 に答える