Compartilhar via


CA2216: Tipos descartáveis devem declarar o finalizador

Propriedade Valor
ID da regra CA2216
Título Tipos descartáveis devem declarar um método finalizador
Categoria Usage
Correção interruptiva ou sem interrupção Inquebrável
Habilitado por padrão no .NET 10 Não
Idiomas aplicáveis C# e Visual Basic

Causa

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

Descrição da regra

Uma violação dessa regra será 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 o método Dispose.

Quando suprimir avisos

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

Suprimir um aviso

Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar 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 em um arquivo, uma pasta ou um projeto, defina a severidade como none no arquivo de configuração.

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

Para obter mais informações, confira 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: Chamar GC.SuppressFinalize corretamente

Confira também