Есть ли эквивалент для класса Java WeakHashMap в C #? - PullRequest
12 голосов
/ 17 января 2010

Существует ли класс C #, который предоставляет карту со слабыми ключами или / и слабыми значениями? Или, по крайней мере, WeakHashMap, как функциональность.

Ответы [ 3 ]

17 голосов
/ 17 января 2010

В .Net 3.5 и ниже такой структуры нет. Однако я написал один для стороннего проекта и разместил код в следующем месте .

Начиная с .NET 4.0, в пространстве имен Runtime.CompilerServices есть доступная структура с именем ConditionalWeakTable, которая также выполняет свою функцию.

6 голосов
/ 10 ноября 2013

До .NET 4 CLR не предоставляла функциональные возможности, необходимые для реализации карты этой формы. В частности, Java предоставляет класс ReferenceQueue<T>, который WeakHashMap использует для управления слабыми ключами на карте. Поскольку в .NET нет эквивалента этому классу, нет чистого способа создать эквивалент Dictionary.

В .NET 4 был добавлен новый класс ConditionalWeakTable<TKey, TValue> в рамках усилий по улучшению способности CLR поддерживать динамические языки. Этот класс использует новый тип дескриптора сборки мусора, который реализован в самом CLR и представлен в mscorlib.dll через внутреннюю структуру DependentHandle.

Это значит для вас следующее:

  1. Нет эквивалента WeakHashMap до .NET 4.
  2. Начиная с .NET 4 и продолжая, по крайней мере, до .NET 4.5.1, единственный способ поддержать функциональность WeakHashMap - это использовать класс ConditionalWeakTable (который закрыт).

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

5 голосов
/ 17 января 2010

Ближайший эквивалент платформы, вероятно, Dictionary<K, WeakReference<V>>.То есть это обычный словарь, но со значениями, являющимися слабыми ссылками.

...