Четкие элементы управления не распоряжаются им - какой риск?

Существует несколько потоков (< a href=" > a, b, c и т.д.) о том, что Очистить() элементы в контейнерах компонентов .NET не Dispose их (вызывая Dispose (true).

Чаще всего, IMHO, компоненты Clear-ed больше не используются в приложении, поэтому он явно должен быть удален после удаления из родительских контейнеров.

Может быть, хорошая идея, что метод коллекции Clear имел параметр bool dispose, который, когда в true также удаляет элементы коллекции перед его удалением из списка?

2 ответа

Просить об изменениях, как это бессмысленно, команда Windows Forms была распущена довольно давно. В режиме обслуживания рассматриваются только проблемы безопасности и несовместимости ОС.

В противном случае достаточно просто создать свой собственный метод для этого:

public static class ExtensionMethods {
 public static void Clear(this Control.ControlCollection controls, bool dispose) {
 for (int ix = controls.Count - 1; ix >= 0; --ix) {
 if (dispose) controls[ix].Dispose();
 else controls.RemoveAt(ix);
 }
 }
 }

Теперь вы можете написать:

panel1.Controls.Clear(true);


Отвечая на вопрос "что такое риск", риск (или риск) заканчивается из оконных ручек, хотя это может занять некоторое время.

У меня есть "конструктор окон", который генерирует окно из script. Каждый раз, когда я изменяю script, окно перестраивается (элементы управления очищаются и считываются). С особенно сложным окном и используя Controls.Clear() каждый раз, после многих десятков обновлений, я в конечном итоге получаю исключение "больше оконных дескрипторов" и не смогу создать никаких дополнительных элементов управления.

Достаточно легко заменить вызов Controls.Clear() на что-то вроде:

Controls.Cast<control>().ForEach(c => c.Dispose());
</control>

licensed under cc by-sa 3.0 with attribution.