Если вы присоединяете событие к обработчику формы и не удаляете его, могут ли форма и объект собираться мусором при закрытии формы? - PullRequest
0 голосов
/ 05 февраля 2010

Вот сценарий.

FormA загружает. ClassA создается в области видимости класса. Пользователь делает что-то, что вызывает событие ClassA.SomeEvent для обработки методом FormA.SomeEventHandler () Пользователь закрывает форму A

Что теперь происходит, когда сборщик мусора делает обход?

Поскольку форма А должна быть утилизирована, но ссылка на нее сделана классом А.

На ClassA все еще ссылаются в области FormA.

Так, как это обрабатывается?

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

  2. .NET отказывается собирать FormA, поскольку на нее ссылается ClassA, и, следовательно, также не собирает ClassA?

  3. .NET собирает FormA, но отказывается собирать ClassA, потому что к его событию прикреплен обработчик (даже если он больше не указывает на существующий объект)?

Насколько я понимаю, 1 или 2 верны, и я склоняюсь к 2, но не сомневаюсь, что 1 или 3 возможны.

Ответы [ 2 ]

1 голос
/ 05 февраля 2010

Если ClassA имеет ссылку на FormA (через обработчик событий), а FormA имеет ссылку на ClassA (посредством удержания его в качестве поля), но ничто иное не имеет ссылку на любой из этих объектов, GC обнаружит круговую ссылку и соберет их обе.

Ключ к тому, будет ли объект подвергаться сборке мусора, заключается в том, содержат ли «корни» ссылку на объект. Корни включают локальные переменные в выполняемый в настоящее время метод (ы) и статические свойства в классах. Если GC не может найти путь от корня до объекта, он будет собирать мусор. В вашем примере, если нет никаких ссылок от любых других объектов на ClassA и FormA, GC не может найти путь от корня до этих объектов и соберет их обоих.

Для получения дополнительной информации я рекомендую Основы сборщика мусора и Советы по производительности .

0 голосов
/ 05 февраля 2010

То, что вы описали, по сути является проблемой со счетчиком ссылок. Я думаю, что .NET использует алгоритм метки-зачистки для GC, что означает, что, пока ничто иное не ссылается на ClassA и FormA, они будут считаться мусором и будут уничтожены (при условии, что я не пропускаю что-то тонкое в отношении событий и формы).

...