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