Проблема сборщика мусора в C # - PullRequest
1 голос
/ 29 января 2009

В коде C # у меня есть три объекта A , B и C . A и B каждый содержит ссылку на C . Когда A уничтожен, я бы хотел, чтобы ссылка с B на C была также удалена, чтобы C мог быть уничтожен Уборщик мусора.

Есть ли способ сделать это, не удаляя его вручную из B ? (Деструктор в C не вызывается до удаления ссылки от B до C , поэтому он не действует здесь.)

Ответы [ 3 ]

10 голосов
/ 29 января 2009

Пахнет как работа для WeakReference :

Слабая ссылка позволяет мусор коллекционер, чтобы собрать объект в то время как все еще позволяя приложению получить доступ к объекту. Если вам нужно объект, вы все еще можете получить сильный ссылка на него и предотвратить его собирать.

Звучит так, как будто вы должны обращаться от B к C через WeakReference, а не напрямую.

7 голосов
/ 29 января 2009

Прежде всего, определите «удалить». А затем рассмотрите возможность использования класса WeakReference.

5 голосов
/ 29 января 2009

Раствор 1

Ссылка на B указана где-либо еще в вашем приложении?

Если B доступен только через A, то B и C будут "удалены", когда A "удален".

Раствор 2

Вы должны отправить сигнал B, когда A "удален". Если B известен A, вы можете подать сигнал B от A. Я бы использовал шаблон IDisposable для этого

Решение 3

Вместо прямой ссылки на C из B, вы можете использовать WeakReference из B, чтобы добраться до C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...