Controles claros não os descartam – qual é o risco?

Existem vários encadeamentos ( a , b , c , etc.) sobre o fato de que os itens Clear () nos contêineres do componente .NET não os descartam (chamando Dispose ( true ).

Com mais freqüência, IMHO, os componentes Clear-ed não são mais usados ​​no aplicativo, portanto, ele precisa ser explicitamente Disposed após limpá-los dos contêineres pai.

Talvez seja uma boa idéia que o método Clear da coleção tenha um parâmetro bool dispose que quando em true também descarta os elementos da coleção antes de sua remoção da lista?

Pedir modificações como essa é inútil, a equipe do Windows Forms foi desfeita há um bom tempo. Está no modo de manutenção, apenas questões de segurança e incompatibilidades de SO são consideradas.

É simples o suficiente para criar seu próprio método para fazer isso:

  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); } } } 

Agora você pode escrever:

  panel1.Controls.Clear(true); 

Respondendo à pergunta “qual é o risco”, o risco (ou um risco) está ficando sem identificadores de janela, embora possa demorar um pouco.

Eu tenho um “designer de janelas” que gera uma janela a partir de um script. Sempre que altero o script, a janela é reconstruída (os controles são limpos e lidos). Com uma janela particularmente complexa, e usando o Controls.Clear() cada vez, depois de muitas dezenas de atualizações, acabarei recebendo uma exceção “sem mais manipuladores de janela” e não será capaz de criar mais nenhum controle.

Fácil o suficiente para replace a chamada Controls.Clear() por algo como:

 Controls.Cast().ForEach(c => c.Dispose());