Есть ли класс С#, который предоставляет карту со слабыми ключами и/или слабыми значениями? Или, по крайней мере, WeakHashMap, как функциональность.
Есть ли эквивалент класса Java WeakHashMap в С#?
Ответ 1
В .Net 3.5 и ниже такой структуры нет. Однако я написал один для стороннего проекта и разместил код в следующем местоположении.
Начиная с .NET 4.0, в пространстве имен Runtime.CompilerServices есть структура, называемая ConditionalWeakTable
, которая также выполняет трюк.
Ответ 2
Ближайшим эквивалентом платформы, вероятно, является Dictionary<K, WeakReference<V>>
. То есть, это просто обычный словарь, но со значениями являются слабыми ссылками.
Ответ 3
До .NET 4 CLR не предоставила функциональность, необходимую для реализации карты этой формы. В частности, Java предоставляет класс ReferenceQueue<T>
, который WeakHashMap
используется для управления слабыми ключами на карте. Поскольку в .NET нет эквивалента этому классу, нет чистого способа создания эквивалентного Dictionary
.
В .NET 4 был добавлен новый класс ConditionalWeakTable<TKey, TValue>
как часть усилий по повышению способности поддержки CLR динамические языки. Этот класс использует новый тип дескриптора сборки мусора, который реализуется внутри самой среды CLR и отображается в mscorlib.dll через внутреннюю структуру DependentHandle
.
Это означает для вас следующее:
- До .NET нет эквивалента
WeakHashMap
. - Начиная с .NET 4 и продолжая, по крайней мере, через .NET 4.5.1, единственным способом поддержки функциональности
WeakHashMap
является использование классаConditionalWeakTable
(который запечатан).
Дополнительная информация находится в следующем сообщении:
Возможно ли создать действительно слабейший словарь на С#?