Compartir a través de


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);
    // }
}

CA1816: Llamar a GC.SuppressFinalize correctamente

Consulte también