Tipos descartáveis devem declarar finalizador
TypeName |
DisposableTypesShouldDeclareFinalizer |
CheckId |
CA2216 |
Category (Categoria) |
Microsoft.uso |
Quebrando alterar |
Não separável |
Causa
Um tipo que implementa System.IDisposablee possui campos que sugerem o uso de recursos não gerenciados, não implementa um finalizador, conforme descrito pela 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 dessa regra, implementar um finalizador chamará seu Dispose método.
Quando suprimir avisos
É seguro eliminar um aviso essa 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 violam 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
Chamar GC.KeepAlive ao usar os recursos nativo
telefonar GC.SuppressFinalize corretamente
Tipos que possuem recursos nativo devem ser descartáveis
Consulte também
Referência
Implementando Finalize e Dispose para Apagar up recursos não gerenciados