Share via


Onbeheerde resources opschonen

Voor een meerderheid van de objecten die uw app maakt, kunt u vertrouwen op de .NET-garbagecollector om geheugenbeheer te verwerken. Wanneer u echter objecten maakt die niet-beheerde resources bevatten, moet u deze resources expliciet vrijgeven wanneer u klaar bent met het gebruik ervan. De meest voorkomende typen niet-beheerde resources zijn objecten die besturingssysteembronnen verpakken, zoals bestanden, vensters, netwerkverbindingen of databaseverbindingen. Hoewel de garbagecollector de levensduur kan bijhouden van een object dat een niet-beheerde resource inkapselt, weet het niet hoe de onbeheerde resource moet worden losgelaat en opgeschoond.

Als uw typen niet-beheerde resources gebruiken, moet u het volgende doen:

  • Implementeer het verwijderingspatroon. Hiervoor moet u een IDisposable.Dispose implementatie opgeven om de deterministische release van niet-beheerde resources in te schakelen. Een consument van uw type roept aan Dispose wanneer het object (en de resources die het gebruikt) niet meer nodig is. Met de Dispose methode worden de onbeheerde resources onmiddellijk vrijgegeven.

  • Als een consument van uw type vergeet aan te roepen Dispose, kunt u ervoor zorgen dat uw onbeheerde resources worden vrijgegeven. Er zijn twee manieren om dit te doen:

    • Gebruik een veilige ingang om uw onbeheerde resource in te pakken. Dit is de aanbevolen techniek. Veilige ingangen zijn afgeleid van de System.Runtime.InteropServices.SafeHandle abstracte klasse en bevatten een robuuste Finalize methode. Wanneer u een veilige ingang gebruikt, implementeert u gewoon de interface en roept u de IDisposable methode van Dispose uw veilige ingang aan in uw IDisposable.Dispose implementatie. De finalizer van de veilige ingang wordt automatisch aangeroepen door de garbagecollector als de Dispose methode niet wordt aangeroepen.

      of

    • Definieer een finalizer. Met voltooien kan de niet-deterministische release van niet-beheerde resources worden ingeschakeld wanneer de consument van een type deze niet deterministisch kan aanroepen IDisposable.Dispose .

      Waarschuwing

      Het voltooien van objecten kan een complexe en foutgevoelige bewerking zijn, we raden u aan een veilige ingang te gebruiken in plaats van uw eigen finalizer te leveren.

Consumenten van uw type kunnen uw IDisposable.Dispose implementatie vervolgens rechtstreeks aanroepen om geheugen vrij te maken dat wordt gebruikt door niet-beheerde resources. Wanneer u een Dispose methode goed implementeert, wordt de methode van uw veilige ingang Finalize of uw eigen onderdrukking van de Object.Finalize methode een beveiliging om resources op te schonen in het geval dat de Dispose methode niet wordt aangeroepen.

In deze sectie

Het implementeren van een verwijderingsmethode beschrijft hoe u het verwijderingspatroon implementeert voor het vrijgeven van niet-beheerde resources.

Het gebruik van objecten die implementeren IDisposable beschrijft hoe consumenten van een type ervoor zorgen dat de Dispose implementatie wordt aangeroepen. We raden u ten zeerste aan om de C# using -instructie (of de Visual Basic Using)-instructie te gebruiken om dit te doen.

Verwijzing

Type/lid Beschrijving
System.IDisposable Hiermee definieert u de methode voor het Dispose vrijgeven van niet-beheerde resources.
Object.Finalize Voorziet in het voltooien van objecten als niet-beheerde resources niet door de Dispose methode worden vrijgegeven.
GC.SuppressFinalize Onderdrukt de voltooien. Deze methode wordt aangepast aangeroepen vanuit een Dispose methode om te voorkomen dat een finalizer wordt uitgevoerd.