Dela via


Rensa ohanterade resurser

För en majoritet av de objekt som din app skapar kan du förlita dig på .NET-skräpinsamlaren för att hantera minneshantering. Men när du skapar objekt som innehåller ohanterade resurser måste du uttryckligen släppa dessa resurser när du är klar med att använda dem. De vanligaste typerna av ohanterade resurser är objekt som omsluter operativsystemresurser, till exempel filer, fönster, nätverksanslutningar eller databasanslutningar. Även om skräpinsamlaren kan spåra livslängden för ett objekt som kapslar in en ohanterad resurs, vet den inte hur man släpper och rensar den ohanterade resursen.

Om dina typer använder ohanterade resurser bör du göra följande:

  • Implementera mönstret för bortskaffning. Detta kräver att du tillhandahåller en IDisposable.Dispose implementering för att aktivera den deterministiska versionen av ohanterade resurser. En konsument av typen anropar Dispose när objektet (och de resurser det använder) inte längre behövs. Metoden Dispose släpper omedelbart ohanterade resurser.

  • Om en konsument av din typ glömmer att anropa Disposeger du ett sätt att frigöra ohanterade resurser. Det finns två sätt att göra detta på:

    • Använd ett säkert handtag för att omsluta din ohanterade resurs. Detta är den rekommenderade tekniken. Valv referenser härleds från den System.Runtime.InteropServices.SafeHandle abstrakta klassen och innehåller en robust Finalize metod. När du använder ett säkert handtag implementerar IDisposable du bara gränssnittet och anropar metoden för det säkra handtaget Dispose i implementeringen IDisposable.Dispose . Slutinsamlaren för det säkra handtaget anropas automatiskt av skräpinsamlaren om dess Dispose metod inte anropas.

      eller

    • Definiera en finalizer. Slutförande möjliggör icke-deterministisk frisläppning av ohanterade resurser när konsumenten av en typ inte anropar IDisposable.Dispose för att ta bort dem deterministiskt.

      Varning

      Objektslutsättning kan vara en komplex och felbenägen åtgärd, vi rekommenderar att du använder ett säkert handtag i stället för att tillhandahålla din egen finalizer.

Konsumenter av din typ kan sedan anropa implementeringen IDisposable.Dispose direkt för att frigöra minne som används av ohanterade resurser. När du implementerar en Dispose metod korrekt blir antingen metoden för det säkra handtaget eller din egen åsidosättning av Object.Finalize metoden ett skydd för att rensa resurser om Dispose metoden inte anropasFinalize.

I detta avsnitt

Implementering av en Dispose-metod beskriver hur du implementerar mönstret för att frigöra ohanterade resurser.

Med hjälp av objekt som implementeras IDisposable beskrivs hur konsumenter av en typ ser till att dess Dispose implementering anropas. Vi rekommenderar starkt att du använder instruktionen C# using (eller Visual Basic Using) för att göra detta.

Referens

Typ/medlem beskrivning
System.IDisposable Definierar Dispose metoden för att frigöra ohanterade resurser.
Object.Finalize Tillhandahåller för objektslutsättning om ohanterade resurser inte frigörs av Dispose metoden.
GC.SuppressFinalize Undertrycker slutförande. Den här metoden anropas vanligtvis från en Dispose metod för att förhindra att en slutförare körs.