弱いキーまたは/および弱い値を持つマップを提供する C# クラスはありますか? または、少なくとも WeakHashMap のような機能。
3 に答える
.Net 3.5 以下では、そのような構造は使用できません。ただし、サイド プロジェクト用に作成し、次の場所にコードを投稿しました。
.NET 4.0 以降ではConditionalWeakTable
、Runtime.CompilerServices 名前空間で呼び出される利用可能な構造があり、これもトリックを実行します。
.NET 4 より前は、CLR はこの形式のマップを実装するために必要な機能を提供していませんでした。特に、Java は、マップ内の弱いキーを管理するためReferenceQueue<T>
に使用するクラスを提供します。WeakHashMap
.NET にはこのクラスに相当するものがないため、同等のものを構築する明確な方法はありませんDictionary
。
ConditionalWeakTable<TKey, TValue>
.NET 4 では、動的言語をサポートする CLR の機能を改善する取り組みの一環として、新しいクラスが追加されました。このクラスは、新しいタイプのガベージ コレクション ハンドルを使用します。このハンドルは、CLR 自体に実装され、内部DependentHandle
構造を通じて mscorlib.dll で公開されます。
これは、次のことを意味します。
WeakHashMap
.NET 4 より前に相当するものはありません。- .NET 4 から始まり、少なくとも .NET 4.5.1 までは、 の機能をサポートする唯一の方法は、 (封印されている) クラス
WeakHashMap
を使用することです。ConditionalWeakTable
追加情報は次の投稿にあります:
Is it possible to create a truely weak-keyed dictionary in C#?
最も近いプラットフォームの同等物は、おそらくDictionary<K, WeakReference<V>>
. つまり、これは単なる通常の辞書ですが、値は弱参照です。