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 Dispose equivalente, tal como um método Close () em alguns tipos de, no mesmo objeto.

Descrição da regra

A correta implementada Dispose método pode ser chamado várias vezes sem lançar 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 assim que 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 do aviso de CA2202. Se o recurso IDisposable aninhado interno using instrução contém o recurso do externo using instrução, o Dispose o método do recurso aninhado libera os recursos contidos. Quando essa situação ocorre, o Dispose método o externo using instrução tenta descartar seu recurso para uma segunda vez.

No exemplo a seguir, um Stream objeto é 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 de instrução, o stream objeto é liberado 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 try/finally bloco em vez do externo using instrução. No finally Bloquear, certifique-se de que o stream recurso é 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

Implementando finalizar e Dispose para limpeza de recursos não gerenciados