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);
}
}
}
Související pravidla
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é
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro