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