Hash-consingは、指定されたオブジェクトのコピーを 1 つだけメモリに保持することで構成されます。つまり、2 つのオブジェクトが意味的に等しい (同じ内容) 場合、それらは物理的に等しい (メモリ内の同じ場所) 必要があります。この手法は通常、グローバル ハッシュ セットを保持し、ハッシュ セット内のオブジェクトと等しくない場合にのみ新しいオブジェクトを作成することによって実装されます。
追加の要件は、ハッシュ テーブル以外から参照されていない場合、ハッシュ テーブル内のオブジェクトが収集可能であることです。別の言い方をすれば、ハッシュ テーブルには弱参照を含める必要があります。
この問題は、一定の時間を確保する必要があるため、さらに複雑になります。したがって、浅く、ハッシュし、等価テストを行います。したがって、オブジェクトには、新しいオブジェクトがテーブルに追加されると増加する一意の識別子があります。
ノードの浅い要約を提供するタプルであり(デフォルトのハッシュと等価テストに適しています) 、オブジェクトSystem.Collections.Generic.Dictionary<key, node>
である whereを使用する実用的な実装があります。唯一の問題は、がノードへの強い参照を保持することです!key
node
Dictionary
Dictionary
to を使用することもできますがWeakReference
、ダングリング参照を指すキーを解放することはできません。
使用を支持する人もSystem.Runtime.CompilerServices.ConditionalWeakTable
いますが、このクラスは逆のようです。キーが収集されると値が解放されますが、値が収集されるとキーを解放する必要があります。
使用してみることができSystem.Runtime.CompilerServices.ConditionalWeakTable<node, node>
ますが、カスタムハッシュと等価テストが必要になります...そして、デフォルトのハッシュ関数を使用する代わりに、仮想メソッドを使用しないConditionalWeakTable
ように文書化されています。GetHashCode()
したがって、私の質問:Dictionary
値への弱い参照を保持し、参照がぶら下がったときにキーを解放するのと同等のものはありますか?