Comparteix a través de


CA2216: Los tipos desechables deben declarar un finalizador

Propiedad Valor
Identificador de la regla CA2216
Título Los tipos desechables deben implementar un finalizador
Categoría Uso
La corrección interrumpe o no interrumpe Sin interrupción
Habilitado de forma predeterminada en .NET 10 No
Idiomas aplicables C# y Visual Basic

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

Se puede suprimir una advertencia de esta regla si el tipo no implementa IDisposable para liberar recursos no gestionados.

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