Можно ли создать действительно слабый словарь в C #?

Я пытаюсь уточнить детали для истинного WeakKeyedDictionary <, > для C # ... но у меня возникают трудности.

Я понимаю, что это нетривиальная задача, но кажущаяся неспособность объявить WeakKeyedKeyValuePair <,> (где GC следует только за ссылкой на значение, если ключ достигнут в состоянии) делает это, казалось бы, невозможным.

Я вижу две основные проблемы:

  1. Все реализации, которые я видел до сих пор, не обрезают значения после того, как ключи были собраны. Подумайте об этом - одна из основных причин использования такого словаря состоит в том, чтобы предотвратить хранение этих значений (а не только ключей!), Поскольку они недоступны, но здесь на них указывают сильные ссылки.

    Да, добавьте / удалите из словаря достаточно, и они в конечном итоге будут заменены, но что, если вы этого не сделаете?

  2. Без гипотетической WeakKeyedKeyValuePair <,> (или другого средства сообщения GC, чтобы отмечать значение только в том случае, если ключ достижим), любое значение, которое относится к этому ключу, никогда не будет собрано. Это проблема при хранении произвольных значений.

Проблема 1 может быть решена довольно неидеальным / хакерским способом: используйте уведомления сборщика мусора, чтобы дождаться завершения полного сборщика мусора, а затем продолжить и сократить словарь в другом потоке. С этим я почти в порядке.

Но проблема 2 поставила меня в тупик. Я понимаю, что этому легко противопоставить «так что не делай этого», но это заставляет меня задуматься - можно ли вообще эту проблему решить?

22
задан Mania 9 December 2011 в 04:39
поделиться