CA2216: Tipos descartáveis devem declarar o finalizador
TypeName |
DisposableTypesShouldDeclareFinalizer |
CheckId |
CA2216 |
<strong>Categoria</strong> |
Microsoft.Usage |
Alteração significativa |
Não separável |
Causa
Um tipo que implementa System.IDisposablee possui campos que sugerem o uso de recursos não gerenciados, que não implementa um finalizador, conforme descrito pela Object.Finalize.
Descrição da regra
Uma violação desta regra é relatada se o tipo descartável contém campos dos seguintes tipos:
Como corrigir violações
Para corrigir uma violação desta regra, implementar um finalizador que chama o Dispose método.
Quando suprimir avisos
É seguro eliminar um aviso esta regra se o tipo não implementa IDisposable a fim de liberar recursos não gerenciados.
Exemplo
O exemplo a seguir mostra um tipo que viole essa 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: Chame GC.Ao usar os recursos nativos de KeepAlive
CA1816: Chame GC.SuppressFinalize corretamente
CA1049: Os tipos que possuem recursos nativos devem ser descartáveis
Consulte também
Referência
Implementando finalizar e Dispose para limpeza de recursos não gerenciados