CA2216: Los tipos descartables deben declarar el finalizador
Propiedad | Value |
---|---|
Identificador de la regla | CA2216 |
Título | Los tipos descartables deben declarar el finalizador |
Categoría | Uso |
La corrección es problemática o no problemática | Poco problemático |
Habilitado de forma predeterminada en .NET 8 | No |
Causa
Un tipo que implementa System.IDisposable, y tiene campos que sugieren el uso de recursos no administrados, no implementa un finalizador como lo describe System.Object.Finalize.
Descripción de la regla
Se genera una infracción de esta regla si el tipo descartable contiene campos de los siguientes tipos:
Cómo corregir infracciones
Para corregir una infracción de esta regla, implemente un finalizador que llame al método Dispose.
Cuándo suprimir las advertencias
Una advertencia de esta regla se puede suprimir si el tipo no implementa IDisposable con la finalidad de liberar recursos no administrados.
Supresión de una advertencia
Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.
#pragma warning disable CA2216
// The code that's violating the rule is on this line.
#pragma warning restore CA2216
Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad en none
del archivo de configuración.
[*.{cs,vb}]
dotnet_diagnostic.CA2216.severity = none
Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.
Ejemplo
En el ejemplo siguiente se muestra un tipo que infringe esta regla.
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
CA1816: Llamar a GC.SuppressFinalize correctamente