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