CA2216: os tipos descartáveis devem declarar o finalizador
TypeName |
DisposableTypesShouldDeclareFinalizer |
CheckId |
CA2216 |
Categoria |
Microsoft.Usage |
Alteração Significativa |
Sem Quebra |
Causa
Um tipo que implementa IDisposable, e tem os campos que sugerem o uso de recursos não gerenciados, não implementa um finalizer como descrito por Object.Finalize.
Descrição da Regra
Uma violação dessa regra é relatada se o tipo descartável contém campos dos seguintes tipos:
Como Corrigir Violações
Para corrigir uma violação desta regra, implemente um finalizer que chama o seu método Dispose.
Quando Suprimir Alertas
É seguro suprimir um aviso desta regra se o tipo não implementa IDisposable com o objetivo de liberar recursos não gerenciados.
Exemplo
O exemplo a seguir mostra um tipo que viola esta regra.
using System;
using System.Runtime.InteropServices;
namespace UsageLibrary
{
public class DisposeMissingFinalize :IDisposable
{
private bool disposed = false;
private IntPtr unmanagedResource;
[DllImport("native.dll")]
private static extern IntPtr AllocateUnmanagedResource();
[DllImport("native.dll")]
private static extern void FreeUnmanagedResource(IntPtr p);
DisposeMissingFinalize()
{
unmanagedResource = AllocateUnmanagedResource();
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
// Dispose of resources held by this instance.
FreeUnmanagedResource(unmanagedResource);
disposed = true;
// Suppress finalization of this disposed instance.
if (disposing)
{
GC.SuppressFinalize(this);
}
}
}
public void Dispose()
{
Dispose(true);
}
// Disposable types with unmanaged resources implement a finalizer.
// Uncomment the following code to satisfy rule:
// DisposableTypesShouldDeclareFinalizer
// ~TypeA()
// {
// Dispose(false);
// }
}
}
Regras Relacionadas
CA2115: chamar GC.KeepAlive durante o uso de recursos nativos
CA1816: chamar GC.SuppressFinalize corretamente
CA1049: tipos que tenham recursos nativos devem ser descartáveis