Compartilhar via


CA2216: Tipos descartáveis devem declarar o finalizador

TypeName

DisposableTypesShouldDeclareFinalizer

CheckId

CA2216

<strong>Categoria</strong>

Microsoft.Usage

Alteração significativa

Não separável

Causa

Um tipo que implementa System.IDisposablee possui campos que sugerem o uso de recursos não gerenciados, que não implementa um finalizador, conforme descrito pela Object.Finalize.

Descrição da regra

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

Como corrigir violações

Para corrigir uma violação desta regra, implementar um finalizador que chama o Dispose método.

Quando suprimir avisos

É seguro eliminar um aviso esta regra se o tipo não implementa IDisposable a fim de liberar recursos não gerenciados.

Exemplo

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

using System;  
using System.Runtime.InteropServices;

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

Regras relacionadas

CA2115: Chame GC.Ao usar os recursos nativos de KeepAlive

CA1816: Chame GC.SuppressFinalize corretamente

CA1049: Os tipos que possuem recursos nativos devem ser descartáveis

Consulte também

Referência

Implementando finalizar e Dispose para limpeza de recursos não gerenciados

System.IDisposable

System.IntPtr

System.Runtime.InteropServices.HandleRef

System.UIntPtr

Object.Finalize