CA1063: implementar IDisposable corretamente
TypeName |
ImplementIDisposableCorrectly |
CheckId |
CA1063 |
Categoria |
Microsoft.Design |
Alteração Significativa |
Sem quebra |
Causa
IDisposable não é implementado corretamente.Algumas razões para esse problema são listadas aqui:
IDisposable novamente é implementado na classe.
Encerre novamente é substituída.
Dispose é substituída.
Dispose() não é público, selado, ou nomeada descartado.
Bool descartado () não é protegido, virtual, nem unsealed.
Em tipos não lacrados, Dispose() deve chamar descartado (retifique).
Para tipos não lacrados, a implementação de finalizacão não chama ou para descartar (bool) ou o finalizador da classe dos casos.
A violação de qualquer um desses padrões disparará esse aviso.
Cada tipo não lacrado IDisposable raiz deve fornecer seu próprio void virtual protegido método dispose de bool ().Dispose() deve chamar Dipose (true) e Termina deve chamar descartado (false).Se você estiver criando um tipo não lacrado IDisposable raiz, você deve definir descartado (bool) e chame.Para obter mais informações, consulte Limpando recursos não gerenciados na seção de Design Guidelines for Developing Class LIbraries da documentação do.NET Framework.
Descrição da Regra
Todos os tipos de IDisposable devem implementar o padrão de disposição corretamente.
Como Corrigir Violações
Examine o código e determine quais das seguintes resoluções corrigirá essa violação.
Remover IDisposable da lista de interfaces que são implementadas por {0} e substituir a classe base disposto a implementação em vez disso.
Remova o finalizador do tipo {0}, substituição descartado (bool que descartado), e coloca a lógica de acabamento no caminho de código onde “descartar” é falsa.
Remover {0}, substituição descartado (bool que descartado), e coloca a lógica de disposição no caminho de código onde “descartar” for verdadeira.
Verifique se {0} ser declarado como públicas e selado.
Renomear {0} “descartado” e ter certeza de que esteja declarado como públicas e selado.
Certifique-se de que {0} é declarado como protegido, virtual, e unsealed.
Modifique {0} de modo que chama descartado (retifique), então chama GC.SuppressFinalize na instância atual do objeto (“a” ou “i” em Visual Basic), e retorna em.
Modifique {0} de modo que chama descartado (false) e retorne em.
Se você estiver escrevendo uma classe não lacrada IDisposable raiz, certifique-se de que a implementação IDisposable segue o padrão descrito anteriormente nesta seção.
Quando Suprimir Alertas
Não elimine um alerta desta regra.
Exemplo do pseudocódigo
O pseudocódigo a seguir fornece um exemplo geral de como descartado (bool) deve ser implementada em uma classe que usa os recursos gerenciados e nativos.
public class Resource : IDisposable
{
private IntPtr nativeResource = Marshal.AllocHGlobal(100);
private AnotherResource managedResource = new AnotherResource();
// Dispose() calls Dispose(true)
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
// NOTE: Leave out the finalizer altogether if this class doesn't
// own unmanaged resources itself, but leave the other methods
// exactly as they are.
~Resource()
{
// Finalizer calls Dispose(false)
Dispose(false);
}
// The bulk of the clean-up code is implemented in Dispose(bool)
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// free managed resources
if (managedResource != null)
{
managedResource.Dispose();
managedResource = null;
}
}
// free native resources if there are any.
if (nativeResource != IntPtr.Zero)
{
Marshal.FreeHGlobal(nativeResource);
nativeResource = IntPtr.Zero;
}
}
}