С#: создать сильную ссылку между объектами, без ссылки на другую
Предположим, что у меня есть 2 класса, Foo и Bar.
Foo не имеет (и не может иметь) отношения к Bar.
Однако, я хочу, чтобы экземпляр бара оставался в живых, пока этот экземпляр foo остается живым.
Есть ли способ сделать это, без foo, фактически ссылающегося на бар?
Спасибо,
Koen
Ответы
Ответ 1
Посмотрите ConditionalWeakTable Class.
Позволяет компиляторам динамически присоединять поля объектов к управляемым объектам.
Это, по сути, словарь, в котором ключ и значение являются значениями WeakReference, и значение сохраняется до тех пор, пока ключ жив.
Например, вы можете определить
ConditionalWeakTable<Foo, Bar> table
и добавьте пару Foo/Bar. Экземпляр Bar сохраняется в памяти, если существует ссылка на экземпляр Foo. Вы можете найти экземпляр Bar для экземпляра Foo, посмотрев на таблицу.
Ответ 2
Трудно давать предложения, не зная точно, чего вы пытаетесь достичь, или того, что вы подразумеваете под "живым". Обычно вам не нужно беспокоиться о жизни управляемых объектов: они "умирают" естественно, когда их больше не ссылают.
Но чтобы делать то, что вам кажется, ваш экземпляр Foo
должен ссылаться на экземпляр Bar
, или какой-либо другой объект должен ссылаться на оба для создания ссылки. Это может быть ссылка на экземпляр Bar
как System.Object
, т.е. Foo
не нужно знать о типе Bar
.
Ответ 3
Бар не может быть завершен, только если SOMETHING имеет ссылку на него. Просто скажите Foo, когда он может отпустить Bar.
Ответ 4
Можете ли вы создать общедоступное поле object, называемое BarReference в типе Foo?
Кто-то вне Foo должен установить соответствующий экземпляр Bar для этого свойства.
Пока есть ссылка на экземпляр бара, он не будет GCed И использование объекта Foo ничего не знает о типе Bar.