Я пытаюсь уточнить детали для истинного WeakKeyedDictionary <, >
для C # ... но у меня возникают трудности.
Я понимаю, что это нетривиальная задача, но кажущаяся неспособность объявить WeakKeyedKeyValuePair <,>
(где GC следует только за ссылкой на значение, если ключ достигнут в состоянии) делает это, казалось бы, невозможным.
Я вижу две основные проблемы:
Все реализации, которые я видел до сих пор, не обрезают значения после того, как ключи были собраны. Подумайте об этом - одна из основных причин использования такого словаря состоит в том, чтобы предотвратить хранение этих значений (а не только ключей!), Поскольку они недоступны, но здесь на них указывают сильные ссылки.
Да, добавьте / удалите из словаря достаточно, и они в конечном итоге будут заменены, но что, если вы этого не сделаете?
Без гипотетической WeakKeyedKeyValuePair <,>
(или другого средства сообщения GC, чтобы отмечать значение только в том случае, если ключ достижим), любое значение, которое относится к этому ключу, никогда не будет собрано. Это проблема при хранении произвольных значений.
Проблема 1 может быть решена довольно неидеальным / хакерским способом: используйте уведомления сборщика мусора, чтобы дождаться завершения полного сборщика мусора, а затем продолжить и сократить словарь в другом потоке. С этим я почти в порядке.
Но проблема 2 поставила меня в тупик. Я понимаю, что этому легко противопоставить «так что не делай этого», но это заставляет меня задуматься - можно ли вообще эту проблему решить?