Los tipos disponibles deben declarar el finalizador
Actualización: noviembre 2007
Nombre de tipo |
DisposableTypesShouldDeclareFinalizer |
Identificador de comprobación |
CA2216 |
Categoría |
Microsoft.Usage |
Cambio problemático |
No problemático |
Motivo
Un tipo que implementa System.IDisposable y tiene campos que sugieren el uso de recursos no administrados, no implementa un finalizador descrito por Object.Finalize.
Descripción de la regla
Se crea informe relativo a una infracción de esta regla si el tipo disponible contiene campos de los tipos siguientes:
Cómo corregir infracciones
Para corregir una infracción de esta regla, implemente un finalizador que llama a su método Dispose.
Cuándo suprimir advertencias
Es seguro suprimir una advertencia de esta regla si el tipo no implementa IDisposable con el propósito de liberar los recursos no administrados.
Ejemplo
El siguiente ejemplo muestra un tipo que infringe esta regla.
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);
// }
}
}
Reglas relacionadas
Llamar a GC.KeepAlive cuando se utilicen recursos nativos
Llamar a GC.SuppressFinalize correctamente
Los tipos que poseen recursos nativos deben estar disponibles
Vea también
Referencia
Implementar Finalize y Dispose para limpiar recursos no administrados