Partilhar via


CA2216: Tipos descartáveis devem declarar finalizador

Propriedade valor
ID da regra CA2216
Cargo Tipos descartáveis devem declarar finalizador
Categoria Utilização
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 8 Não

Causa

Um tipo que implementa e tem campos que sugerem o uso de recursos não gerenciados System.IDisposable, não implementa um finalizador conforme descrito por System.Object.Finalize.

Descrição da regra

Uma violação desta regra é relatada se o tipo descartável contiver campos dos seguintes tipos:

Como corrigir violações

Para corrigir uma violação dessa regra, implemente um finalizador que chame seu Dispose método.

Quando suprimir avisos

É seguro suprimir um aviso dessa regra se o tipo não for implementado IDisposable com a finalidade de liberar recursos não gerenciados.

Suprimir um aviso

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.

#pragma warning disable CA2216
// The code that's violating the rule is on this line.
#pragma warning restore CA2216

Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_diagnostic.CA2216.severity = none

Para obter mais informações, consulte Como suprimir avisos de análise de código.

Exemplo

O exemplo a seguir mostra um tipo que viola essa regra.

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: Ligue para GC. SuppressFinalize corretamente

Consulte também