Compartir a través de


Los tipos disponibles deben declarar el finalizador

Actualización: noviembre 2007

Nombre de tipo

DisposableTypesShouldDeclareFinalizer

Identificador de comprobación

CA2216

Categoría

Microsoft.Usage

Cambio problemático

No problemático

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

Llamar a GC.KeepAlive cuando se utilicen recursos nativos

Llamar a GC.SuppressFinalize correctamente

Los tipos que poseen recursos nativos deben estar disponibles

Vea también

Referencia

Implementar Finalize y Dispose para limpiar recursos no administrados

System.IDisposable

System.IntPtr

System.Runtime.InteropServices.HandleRef

System.UIntPtr

Object.Finalize