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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top