Страницы

Поиск по вопросам

воскресенье, 7 июля 2019 г.

Получить из объекта все объекты, которые ссылаются на него

Вопрос интереса ради:
CLR удаляет объекты на основании отсутствия корневых ссылок => он владеет информацией о ссылках между объектами.
Теперь собственно сам вопрос:
Допустим есть 2 объекта.
1 Объект содержит поле, которое ссылается на объект 2.
Можно ли имея на руках второй объект понять, что на него что-то ссылается и получить эту ссылку?


Ответ

Нет, этой информации нет, т. к. объект знает только свои ссылки на другие объекты. Вы можете её получить, но это сложно.
Смотрите, что делает сборщик мусора. Он знает все корневые объекты. Это статические объекты, а также объекты, ссылки на которые есть в стеке какого-либо из потоков.* Он считает их достижимыми, не подлежащими удалению. Затем, он проходит по ссылкам из уже найденных достижимых объектов, найденные объекты тоже объявляет достижимыми. Затем он обходит вновь определённые достижимые объекты, проходит по их ссылкам, и найденные объекты тоже объявляет достижимыми.
Таким образом, обходя достижимые объекты, сборщик мусора рано или поздно натыкается на ссылку, ведущую из первого объекта во второй. Или не натыкается, если первый объект не достижим.

Повторять этот алгоритм большого смысла нет, т. к. это просто медленно. (И у нас в руках лишь довольно медленная рефлексия.)
Проблему, которая у вас на руках, нужно решать по-другому. Например, заставлять объекты, которым нужен ваш объект №2, регистрироваться самостоятельно.

*ну и объекты, на которые ссылаются всякие GCHandle'ы

Комментариев нет:

Отправить комментарий