Čištění nespravovaných prostředků

Pro většinu objektů, které vaše aplikace vytvoří, můžete spoléhat na systém uvolňování paměti .NET pro zpracování správy paměti. Když však vytváříte objekty, které obsahují nespravované prostředky, je nutné tyto prostředky explicitně uvolnit po jejich použití. Nejběžnějšími typy nespravovaných prostředků jsou objekty, které zabalí prostředky operačního systému, jako jsou soubory, Windows, síťová připojení nebo databázová připojení. Přestože je systém uvolňování paměti schopen sledovat dobu platnosti objektu, který zapouzdřuje nespravovaný prostředek, nemá specifické znalosti o tom, jak spravovaný prostředek uvolnit a vyčistit.

Pokud vaše typy používají nespravované prostředky, měli byste provést následující úkony:

  • Implementujte vzor Dispose. K tomu je potřeba poskytnout implementaci, která umožňuje IDisposable.Dispose deterministické vydání nespravovaných prostředků. Příjemce volání typu Dispose v případě, že objekt (a prostředky, které používá) již není potřeba. DisposeMetoda okamžitě uvolní nespravované prostředky.

  • V případě, že příjemce vašeho typu zapomene zavolat Dispose , poskytněte možnost uvolnění nespravovaných prostředků. Toto lze provést dvěma způsoby:

    • Použijte bezpečný popisovač, který zajistí obtékání nespravovaných prostředků. Toto je doporučený postup. Bezpečné popisovače jsou odvozeny z System.Runtime.InteropServices.SafeHandle abstraktní třídy a obsahují robustní Finalize metodu. Pokud používáte bezpečný popisovač, jednoduše implementujete IDisposable rozhraní a zavoláte metodu bezpečného popisovače Dispose v IDisposable.Dispose implementaci. Finalizační metoda bezpečného popisovače je volána automaticky systémem uvolňování paměti, pokud není Dispose volána jeho metoda.

      nebo

    • Přepsat Object.Finalize metodu. Finalizace umožňuje nedeterministické vydání nespravovaných prostředků, když příjemce typu nevolá, IDisposable.Dispose aby bylo možné je vyřadit z něj deterministické. Definujte finalizační metodu přepsáním Object.Finalize metody.

    Upozornění

    Avšak vzhledem k tomu, že finalizace objektu může být složitá a operace náchylná k chybám, doporučujeme místo poskytování vlastního finalizační metody použít bezpečný popisovač.

Příjemci vašeho typu můžou následně zavolat vaši IDisposable.Dispose implementaci přímo na volnou paměť využívanou nespravovanými prostředky. Při správné implementaci metody se Dispose buď metoda bezpečného popisovače Finalize nebo vaše vlastní přepsání Object.Finalize metody změní na zabezpečení pro vyčištění prostředků v případě, že Dispose metoda není volána.

V této části

Implementace metody Dispose popisuje, jak implementovat vzor Dispose pro uvolnění nespravovaných prostředků.

Použití objektů, které IDisposable implementují Popisuje, jak uživatelé typu zajišťují, že Dispose je volána jeho implementace. usingK tomu doporučujeme použít příkaz C# (nebo Visual Basic Using ).

Reference

Typ/člen Popis
System.IDisposable Definuje Dispose metodu pro uvolnění nespravovaných prostředků.
Object.Finalize Poskytuje finalizaci objektu, pokud není nespravované prostředky uvolněny Dispose metodou.
GC.SuppressFinalize Potlačí finalizaci. Tato metoda je obvykle volána z Dispose metody, aby zabránila spuštění finalizační metody.