Есть ли эквивалент класса Java WeakHashMap в С#?

Есть ли класс С#, который предоставляет карту со слабыми ключами и/или слабыми значениями? Или, по крайней мере, 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 (который запечатан).

Дополнительная информация находится в следующем сообщении:
Возможно ли создать действительно слабейший словарь на С#?