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

U většiny objektů, které vaše aplikace vytvoří, můžete při správě paměti spoléhat na uvolňování paměti .NET. Pokud ale vytváříte objekty, které obsahují nespravované prostředky, musíte tyto prostředky explicitně uvolnit, jakmile je budete používat. Nejběžnější typy nespravovaných prostředků jsou objekty, které zabalují prostředky operačního systému, jako jsou soubory, okna, 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. To vyžaduje, abyste zadali IDisposable.Dispose implementaci, která umožní deterministické uvolnění nespravovaných prostředků. Příjemce typu volá Dispose , když objekt (a prostředky, které používá) už nepotřebujete. Metoda Dispose okamžitě uvolní nespravované prostředky.

  • V případě, že příjemce vašeho typu zapomene volat Dispose, poskytněte způsob, jak uvolnit nespravované prostředky. 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. Sejf popisovače jsou odvozeny z System.Runtime.InteropServices.SafeHandle abstraktní třídy a obsahují robustní Finalize metodu. Při použití bezpečného popisovače jednoduše implementujete IDisposable rozhraní a zavoláte metodu bezpečného Dispose popisovače v IDisposable.Dispose implementaci. Finalizační metoda bezpečného popisovače je volána automaticky uvolňováním paměti, pokud není volána jeho Dispose metoda.

      nebo

    • Definujte finalizační metodu. Finalizace umožňuje nedeterministické uvolnění nespravovaných prostředků v případě, že se příjemci typu nepodaří volat IDisposable.Dispose jejich deterministicky.

      Upozorňující

      Finalizace objektů může být složitá a náchylná k chybám. Doporučujeme místo poskytnutí vlastní finalizátoru použít bezpečný popisovač.

Příjemci vašeho typu pak mohou volat vaši IDisposable.Dispose implementaci přímo k uvolnění paměti používané nespravovanými prostředky. Při správné implementaci Dispose metody se buď metoda bezpečného Object.Finalize popisovačeFinalize, nebo vaše vlastní přepsání metody stane zárukou 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 model Dispose pro uvolnění nespravovaných prostředků.

Použití objektů, které implementují IDisposable , popisuje, jak spotřebitelé typu zajišťují, že se volá jeho Dispose implementace. K tomu důrazně doporučujeme použít příkaz jazyka C# using (nebo Visual Basic Using).

Reference

Typ nebo člen Popis
System.IDisposable Definuje metodu Dispose uvolnění nespravovaných prostředků.
Object.Finalize Poskytuje pro dokončení objektu, pokud nespravované prostředky nejsou uvolněny metodou Dispose .
GC.SuppressFinalize Potlačí finalizaci. Tato metoda se obvykle volá z Dispose metody, aby se zabránilo spuštění finalizátoru.