Ligar para Clear também descarta os itens?
-
21-09-2019 - |
Pergunta
Muitas vezes existe um método claro, que retira todos os itens das coleções, esses itens também são descartados.
Como,
toolStripMenuItem.DropDownItems.Clear();
é suficiente, ou devo ligar assim:
foreach (ToolStripItem item in toolStripMenuItem.DropDownItems)
{
toolStripMenuItem.DropDownItems.Remove(item);
item.Dispose();
}
Editar:Bem, ToolStripItem é um exemplo, não uma pergunta, para quem diz que Clear é suficiente, encontrei outro exemplo, TabControl também possui coleção de itens e método clear.Mas TabControls podem ter controles complexos (pelo menos eu tenho), que precisam ser explicitamente Dispose (mesmo que sejam Disposed automaticamente em algum momento pelo GC, porque ocupam muita memória).Acho que a melhor resposta é comentar divo para descartar os itens e depois ligar para limpar.
Solução
P: Faz?
A: Não - Clear
não descarta os itens (eles podem ser usados em outras partes da sua aplicação).
Portanto, se seus ToolStripItems forem padrão .NET, você deve Clear
ser suficiente?Depois de alguma reflexão eu diria “provavelmente não”.
Sim, é verdade que se você tiver alguma referência ao ToolStripItem em outra parte do seu aplicativo, o .NET Coletor de lixo irá destruir (use a classe destruidor) automaticamente.Mas, isso não vou ligar para Dispose(true)
método, isso é, no entanto, necessário para o formulário IDisposable
componentes.
Leia uma proposta esse e esse.
Na verdade, acredito que você precisará, no entanto, explicitamente Dispose
seus itens, como o ToolStrip Descartar método faz (substituir esse por sua ToolStrip):
if (!this.Items.IsReadOnly)
{
for (int i = this.Items.Count - 1; i >= 0; i--)
{
this.Items[i].Dispose();
}
this.Items.Clear();
}
EDITAR
Eu também criei o seguinte tópico para esclarecer esta questão de forma mais geral.
Outras dicas
Você deveria confiar Dispose()
Ligue para quando estiver lidando com memória não gerenciada, recursos compartilhados ou grandes áreas de memória. Não parece esse caso.
Chamando Clear
Não descarta os itens, mas ele remove a referência da coleção para os itens. Se essa foi a única referência aos itens que eles serão coletados de lixo automaticamente em algum momento (que você não pode prever, mas você pode controlar usando o GC
classe).
Acho que não, mais, isso pode causar muitos problemas lógicos, porque você pode ter referência a esse objeto na coleção para uso posterior. Se você não tiver referências a esses objetos, o coletor de lixo descartará que objetos mais tarde