Насколько глубоко очищается Controls.Clear()?

Я использую TableLayoutPanel, который динамически заполняется другим TablelayoutPanels.

Теперь мне интересно, что происходит, когда я вызываю TableLayoutPanel.Controls.Clear на динамически заполненный TableLayoutPanel. Очевидно, все субмакеты удалены, но как насчет их детей? Правильно ли они настроены или мне нужно бояться утечки памяти?

Должен ли я рекурсивно удалять дочерние элементы дочерних элементов перед вызовом Clear()?

Ответ 1

Clear не удаляет элементы управления, что приводит к утечке памяти. По ссылке:

Вызов метода Clear не удаляет ручки управления из памяти. Вы должны явно вызвать метод Dispose, чтобы избежать утечек памяти.

Так как удаление внутри цикла помешает индексированию, вы можете либо скопировать коллекцию управления в другой список и выполнить цикл ForEach на них, либо использовать обратный цикл For.

 for (int i = myTableLayoutPanelControls.Count - 1; i >= 0; --i) 
    myTableLayoutPanelControls[i].Dispose();

Вызов Dispose приведет к удалению элементов управления из памяти (когда GC берет его). Это также будет обрабатывать вызов дочернего элемента управления Dispose.

Один улов, если у вас есть настраиваемый элемент управления, который реализует IDisposable, или вы переопределяете метод Dispose, не вызывая метод base. В методе Dispose объекта вам необходимо убедиться, что вы отменили подписку на любые события за пределами вашей области. Если вы этого не сделаете, эта ссылка сохранит ваш объект.

Ответ 2

В вашем вопросе есть путаница. Clear() удалит ссылки, и объекты будут собраны сборщиком мусора.

Но вы также используете слово dispose. Очищенные объекты не будут удалены в том смысле, что их метод dispose будет вызван.

Таким образом, если вы больше не используете эти объекты и хотите, чтобы dispose вызывался на них, вы должны сделать это сами.