В какой ситуации объект будет очищен с помощью GC.Collect ()? - PullRequest
2 голосов
/ 14 сентября 2010

Я пишу программное обеспечение на Silverlight с C #.

Я знаю, что GC.Collect будет собирать объекты и элементы управления, если на них нет ссылок, но я не уверен, что имеется в виду под ссылками.

Я знаю, что в Silverlight мне нужно удалить элемент управления (скажем, «Control A») из макета, удалить весь обработчик событий, а затем установить для объекта значение null, чтобы он не ссылался на объект. Что-то вроде:

1) если «Элемент управления A» содержит другие элементы управления: «Элемент управления B», «Элемент управления C», и они могут где-то иметь подписанный обработчик событий.

Будет ли "Control A" по-прежнему собираться GC.Collect ()? А как насчет "Control B" "Control C"?

Должен ли я на самом деле удалить все, что "Control B" и "Control C", которые содержат, и удалить "Control B" "Control C" из "Control A", чтобы позволить им собраться?

2) Скажите, что если есть «Control D», то есть ComboBox, и ComboBox имеет много ComboxBoxItem.

Должен ли я удалить () все ComboxBoxItem, чтобы эти ComboxBoxItem были собраны?

Или когда я удаляю ComboBox из «Control D», тоже выну ComboxBoxItem?

Я немного запутался с Delete в C ++, поскольку в C ++ я могу просто удалить весь объект со всем, что в нем содержится ...

Ответы [ 2 ]

2 голосов
/ 14 сентября 2010

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

Если элемент управления A (B, C) подписан на какое-либо событие класса D, это означает, что класс D имеет ссылку на A (B, C). Это предотвращает сбор этих элементов управления.

Что касается внутренних взаимных ссылок между элементом управления A и его дочерними элементами, GC достаточно умен, чтобы распознать это и собрать их все.

1 голос
/ 14 сентября 2010

Объект будет собираться только в том случае, если на него не ссылается (прямо или косвенно) корневая переменная, находящаяся в области видимости (либо в стеке, либо в статическом). Другими словами, если A ссылается на B и B ссылается на A, они оба будут собраны.

С http://msdn.microsoft.com/en-us/library/ee787088.aspx:

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

Стеки корней. Переменные стека, предоставляемые компилятором JIT (Just-in-Time) и обходчиком стека.

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

Статические данные. Статические объекты в доменах приложений, которые могут ссылаться на другие объекты. Каждый домен приложения отслеживает свои статические объекты.

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