Se um conjunto genérico é instanciado para conter iDisposable itens, fazer os itens de obter descartado?

StackOverflow https://stackoverflow.com/questions/496722

  •  20-08-2019
  •  | 
  •  

Pergunta

Por exemplo:

Queue<System.Drawing.SolidBrush> brushQ = new Queue<System.Drawing.SolidBrush>();
...
brushQ.Clear();

Se eu não explicitamente retirar da fila de cada item e eliminá-los individualmente, fazer os restantes itens podem ser descartados quando chamar Clear()?Como sobre quando a fila é lixo coletado?

Supondo que a resposta é "não", então, qual é a melhor prática?Você tem sempre iterar através de fila e descarte de cada item?

Que pode ficar feio, especialmente se você tem que tentar..finalmente em torno de cada dispor, no caso de um lança uma exceção.

Editar

Assim, parece que o ônus é sobre o usuário de um conjunto genérico para saber que, se os itens são Descartáveis (o que significa que elas são, provavelmente, usando recursos não gerenciados que não vai ser limpos pelo coletor de lixo), então:

  1. Quando você remover um item da coleção, certifique-se de que você Destrua-o ().
  2. NÃO CHAMAR Clear().Iterar a coleta e o descarte de cada o item.

Talvez a documentação para o genérico coleções de mencionar isso.

Foi útil?

Solução

Quando você espera de serem eliminados?Como será a coleta de saber se existem outras referências para os objetos nele?

Outras dicas

O genérico coleções, na verdade, não sabemos nada sobre o tipo de objeto que eles contêm, por isso, chamar Claro não vão causar-lhes para chamar Dispose() os itens.O GC irá eventualmente eliminá-los uma vez que a coleção em si é descartado, desde que nada mais tem um ativo de referência para um desses itens.

Se você deseja garantir que os objetos têm suas Dispose método chamado quando você chama Clara sobre a coleção que seria necessário para obter sua própria coleção e substituir os métodos apropriados e fazer chamadas a si mesmo.

Deixe-me ver se eu posso escrever um código de exemplo para um presente.

Editar:

O código a seguir implementa um IDisposable Fila:

class DisposableQueue<T>:Queue<T>,IDisposable where T:IDisposable

    #region IDisposable Members

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    public virtual void Dispose(bool disposing) {
        if (disposing) {
            foreach (T type in this) {
                try
                {
                    type.Dispose();
                }
                finally {/* In case of ObjectDisposedException*/}
            }
        }
    }
    #endregion
}

Como outros já disseram, isso não vai acontecer.No entanto, você pode construir o seu próprio método de extensão para descartá-los, se quiser.

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