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();
}