CA1049: Typy, které vlastní nativní prostředky by měly být uvolnitelné

Zboží Hodnota
RuleId CA1049
Kategorie Microsoft.Design
Změna způsobující chybu Nenarušující

Příčina

Typ odkazuje na System.IntPtr pole, System.UIntPtr pole nebo System.Runtime.InteropServices.HandleRef pole, ale neimplementuje System.IDisposable.

Popis pravidla

Toto pravidlo předpokládá, že IntPtrUIntPtrpole a HandleRef pole ukládají ukazatele na nespravované prostředky. Typy, které přidělují nespravované prostředky, by měly implementovat IDisposable , aby volajícím umožnili uvolnit tyto prostředky na vyžádání a zkrátit životnost objektů, které obsahují prostředky.

Doporučeným vzorem návrhu pro vyčištění nespravovaných prostředků je poskytnutí implicitního i explicitního způsobu uvolnění těchto prostředků pomocí System.Object.Finalize metody a System.IDisposable.Dispose metody. Systém uvolňování paměti volá Finalize metodu objektu v určitém nedeterminátu času po určení, že objekt již není dostupný. Po Finalize zavolání se k uvolnění objektu vyžaduje další uvolňování paměti. Metoda Dispose umožňuje volajícímu explicitně uvolnit prostředky na vyžádání, dříve než prostředky by byly uvolněny, pokud by zůstal v systému uvolňování paměti. Jakmile vyčistí nespravované prostředky, Dispose měl by voláním System.GC.SuppressFinalize metody dát systému uvolňování paměti vědět, že Finalize už není nutné volat. Tím se eliminuje nutnost dalšího uvolňování paměti a zkracuje životnost objektu.

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla, implementujte IDisposable.

Kdy potlačit upozornění

Pokud typ neodkazuje na nespravovaný prostředek, je bezpečné potlačit upozornění z tohoto pravidla. Jinak nepotlačujte upozornění z tohoto pravidla, protože selhání implementace IDisposable může způsobit nedostupnost nebo nedostupnost nespravovaných prostředků.

Příklad

Následující příklad ukazuje typ, který implementuje IDisposable vyčištění nespravovaného prostředku.

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: Volejte GC.KeepAlive při použití nativních zdrojů

CA1816: Volejte správně GC.SuppressFinalize

CA2216: Uvolnitelné typy by měly deklarovat finalizační metodu

CA1001: Typy vlastních uvolnitelných polí, které by měly být uvolnitelné

Viz také