Я вот тут написал классик для кэша, на слабых ссылках. Тоесть если на элемент кэша нигде не ссылаются, он может быть удалён сборщиком мусора, когда тот захочет. Внутри кэша Dictionary<TKey, WeakReference>, и у кэша есть методы Contains и GetItem. Метод Contains проверяет, содержится ли объект в кэше по ключу и не удалён ли он, т.е. свойство IsAlive у экземпляра WeakReference. Метод GetItem возвращает свойство Target WeakReference-а.
Так вот, меня теперь мучают сомнения. Вот получу я что объект жив, и соберусь вызвать GetItem. А злобный GC возьмёт и сколлектит мой айтем, и тогда я получу null. А буду думать что там объект. В качестве решения я завёл в классе кэша поле private TItem m_guard и перед проверкой IsAlive запоминаю туда Target. А после GetItem делаю m_guard = null;. Вот.
Собственно, вопрос. Я конечно понимаю, что это велосипед. Может быть кто знает как это делается по-человечески? Ведь если я проверю наличие, а получать не буду, то GC не сможет почистить этот объект, когда будет надо...