Compartilhar via


CA2202: não descartar objetos várias vezes

TypeName

DoNotDisposeObjectsMultipleTimes

CheckId

CA2202

Categoria

Microsoft.Usage

Alteração Significativa

Sem Quebra

Causa

Uma implementação do método contém os caminhos de código que poderiam causar várias chamadas para IDisposable.Dispose ou a um equivalente de disposição, como um () próximo método em alguns tipos, no mesmo objeto.

Descrição da Regra

Um método corretamente implementado de Dispose pode ser chamado várias vezes sem gerar uma exceção.No entanto, isso não é garantido e para evitar gerar ObjectDisposedException que você não deve chamar Dispose mais de uma vez em um objeto.

Regras Relacionadas

CA2000: descartar objetos antes de perder o escopo

Como Corrigir Violações

Para corrigir uma violação desta regra, altere a implementação de modo que independentemente do caminho de código, Dispose é chamado apenas uma vez para o objeto.

Quando Suprimir Alertas

Não elimine um alerta desta regra.Se Dispose para o objeto é conhecido para ser acessível com segurança várias vezes, a implementação pode ser alterada no futuro.

Exemplo

As instruções aninhadas de using (Using no Visual Basic) podem causar violações de aviso CA2202.Se o recurso IDisposable da instrução aninhada interna de using contém o recurso da instrução exterior de using , o método de Dispose de recursos aninhado libera o recurso independente.Quando essa situação acontece, o método de Dispose da instrução exterior de using tentar descartar seu recurso pela segunda vez.

No exemplo a seguir, um objeto de Stream criado em uma instrução de utilização exterior é liberado no final da instrução de utilização interna no método dispose do objeto de StreamWriter que contém o objeto de stream .No final da instrução exterior de using , o objeto de stream é liberado em uma segunda vez.A segunda versão é uma violação de CA2202.

using (Stream stream = new FileStream("file.txt", FileMode.OpenOrCreate))
{
    using (StreamWriter writer = new StreamWriter(stream))
    {
        // Use the writer object...
    }
}

Para resolver esse problema, use um bloco de try/finally em vez da instrução exterior de using .No bloco de finally , verifique se o recurso de stream não for nulo.

Stream stream = null;
try
{
    stream = new FileStream("file.txt", FileMode.OpenOrCreate);
    using (StreamWriter writer = new StreamWriter(stream))
    {
        stream = null;
        // Use the writer object...
    }
}
finally
{
    if(stream != null)
        stream.Dispose();
}

Consulte também

Referência

IDisposable

Outros recursos

Implementing Finalize and Dispose