Подтвердить что ты не робот

С#: создать сильную ссылку между объектами, без ссылки на другую

Предположим, что у меня есть 2 класса, Foo и Bar. Foo не имеет (и не может иметь) отношения к Bar.

Однако, я хочу, чтобы экземпляр бара оставался в живых, пока этот экземпляр foo остается живым. Есть ли способ сделать это, без foo, фактически ссылающегося на бар?

Спасибо, Koen

4b9b3361

Ответ 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.