CA1049: Los tipos que poseen recursos nativos deben ser descartables

Elemento Valor
RuleId CA1049
Category Microsoft.Design
Cambio importante Poco problemático

Causa

Un tipo hace referencia a un campo System.IntPtr, un campo System.UIntPtr o un campo System.Runtime.InteropServices.HandleRef, pero no implementa System.IDisposable.

Descripción de la regla

Esta regla supone que los campos IntPtr, UIntPtr y HandleRef almacenan punteros a recursos no administrados. Los tipos que se asignan a recursos no administrados deberían implementar IDisposable para permitir que los llamadores liberen estos recursos a petición y reduzcan el período de duración de los objetos que contienen los recursos.

El patrón de diseño recomendado para limpiar los recursos no administrados es proporcionar un medio implícito y explícito para liberar esos recursos mediante el método System.Object.Finalize y el método System.IDisposable.Dispose, respectivamente. El recolector de elementos no utilizados llama al método Finalize de un objeto en algún momento indeterminado después de determinar que el objeto ya no es accesible. Después de llamar a Finalize, se requiere una recolección de elementos no utilizados adicional para liberar el objeto. El método Dispose permite que el autor de la llamada libere explícitamente los recursos a petición, antes de lo que se liberarían si se dejaran al recolector de elementos no utilizados. Después de limpiar los recursos no administrados, Dispose debe llamar al método System.GC.SuppressFinalize para que el recolector de elementos no utilizados sepa que ya no tiene que llamar a Finalize; esto elimina la necesidad de la recolección adicional de elementos no utilizados y reduce la vigencia del objeto.

Cómo corregir infracciones

Para corregir una infracción de esta regla, implemente IDisposable.

Cuándo suprimir las advertencias

Es seguro suprimir una advertencia de esta regla si el tipo no hace referencia a un recurso no administrado. De lo contrario, no suprima una advertencia de esta regla porque si no se implementa IDisposable, los recursos no administrados pueden dejar de estar disponibles o que queden infrautilizados.

Ejemplo

En el ejemplo siguiente se muestra un tipo que implementa IDisposable para limpiar un recurso no administrado.

using System;

namespace DesignLibrary
{
    public class UnmanagedResources : IDisposable
    {
        IntPtr unmanagedResource;
        bool disposed = false;

        public UnmanagedResources() 
        {
            // Allocate the unmanaged resource ...
        }

        public void Dispose() 
        {
            Dispose(true);
            GC.SuppressFinalize(this); 
        }

        protected virtual void Dispose(bool disposing)
        {
            if(!disposed)
            {
                if(disposing)
                {
                    // Release managed resources.
                }

                // Free the unmanaged resource ...

                unmanagedResource = IntPtr.Zero;

                disposed = true;
            }
        }

        ~UnmanagedResources()
        {
            Dispose(false);
        }
    }
}

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

CA1816: Llamar a GC.SuppressFinalize correctamente

CA2216: Los tipos descartables deben declarar el finalizador

CA1001: Los tipos que poseen campos descartables deben ser descartables

Consulte también