Compartilhar via


CA2202: Não dispor objetos várias vezes

TypeName

DoNotDisposeObjectsMultipleTimes

CheckId

CA2202

<strong>Categoria</strong>

Microsoft.Usage

Alteração significativa

Não separável

Causa

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

Descrição da regra

A correta implementada do Dispose método pode ser chamado várias vezes sem gerar uma exceção.No entanto, isso não é garantido e para evitar a geração de um System.ObjectDisposedException você não deve chamar Dispose mais de uma vez em um objeto.

Regras relacionadas

CA2000: Descartar objetos antes de perder escopo

Como corrigir violações

Para corrigir uma violação desta regra, alterar a implementação tão isto independentemente do caminho de código, Dispose é chamado somente uma vez para o objeto.

Quando suprimir avisos

Não suprimir um aviso da regra.Mesmo se Dispose para o objeto é conhecido por ser com segurança que pode ser chamado várias vezes, a implementação pode mudar no futuro.

Exemplo

Aninhado using instruções (Using em Visual Basic) pode causar violações CA2202 do aviso de advertência.Se o recurso de IDisposable do aninhados interno using instrução contém o recurso do externo using instrução, o Dispose método do recurso aninhado libera recurso contido.Quando essa situação ocorre, o Dispose método do externo using instrução tenta descartar seu recurso pela segunda vez.

No exemplo a seguir, um Stream objeto que é criado em um externa usando a instrução for lançado no final do interno usando a instrução no método Dispose da StreamWriter objeto que contém o stream objeto.No final o externo using instrução, o stream o objeto é liberado pela 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 try/finally bloco em vez do externo using instrução.No finally bloquear, certifique-se de que o stream recurso não é 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

System.IDisposable

Implementing Finalize and Dispose