Compartir a través de


CA2216: Los tipos descartables deben declarar el finalizador

Nombre de tipo

DisposableTypesShouldDeclareFinalizer

Identificador de comprobación

CA2216

Categoría

Microsoft.Usage

Cambio problemático

No

Motivo

Un tipo que implementa System.IDisposable y tiene campos que sugieren el uso de recursos no administrados, no implementa un finalizador descrito por Object.Finalize.

Descripción de la regla

Se crea informe relativo a una infracción de esta regla si el tipo disponible contiene campos de los tipos siguientes:

Cómo corregir infracciones

Para corregir una infracción de esta regla, implemente un finalizador que llama a su método Dispose.

Cuándo suprimir advertencias

Es seguro suprimir una advertencia de esta regla si el tipo no implementa IDisposable con el propósito de liberar los recursos no administrados.

Ejemplo

El siguiente ejemplo muestra un tipo que infringe esta regla.

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

Reglas relacionadas

CA2115: Llamar a GC.KeepAlive cuando se utilicen recursos nativos

CA1816: Llamar a GC.SuppressFinalize correctamente

CA1049: Los tipos que poseen recursos nativos deben ser descartables

Vea también

Referencia

Implementing Finalize and Dispose

System.IDisposable

System.IntPtr

System.Runtime.InteropServices.HandleRef

System.UIntPtr

Object.Finalize