Verschil tussen destructor, verwijdering en afrondingsmethode

Ik bestudeer hoe garbage collector werkt in c#. Ik ben in de war over het gebruik van de methoden Destructor, Disposeen Finalize.

Volgens mijn onderzoek en mijn inzichten, zal het hebben van een Destructor-methode in mijn klas de vuilnisophaler vertellen om de vuilnisophaling uit te voeren op de manier die wordt vermeld in de destructor-methode die niet expliciet kan worden aangeroepen op de instanties van de klasse.

De Disposemethode is bedoeld om de gebruiker controle te geven over de garbagecollection. De methode Finalizemaakt de bronnen vrij die door de klasse worden gebruikt, maar niet het object zelf.

Ik weet niet zeker of ik het goed begrijp. Gelieve de twijfels te verduidelijken. Alle verdere links of handleidingen zijn welkom.


Antwoord 1, autoriteit 100%

Destructor roept impliciet de Finalize-methode aan, technisch gezien zijn ze hetzelfde. Dispose is beschikbaar met objecten die de IDisposable-interface implementeren.

Mogelijk ziet u: Destructors C# – MSDN

De destructor roept impliciet Finalize aan op de basisklasse van de
voorwerp.

Voorbeeld van dezelfde link:

class Car
{
    ~Car()  // destructor
    {
        // cleanup statements...
    }
}

De code van Destructor wordt impliciet vertaald naar de volgende code:

protected override void Finalize()
{
    try
    {
        // Cleanup statements...
    }
    finally
    {
        base.Finalize();
    }
}

Uw begrip voor de Destructor heeft gelijk:

Van MSDN

De programmeur heeft geen controle over wanneer de destructor wordt aangeroepen
omdat dit wordt bepaald door de vuilnisman
. Het afval
verzamelaar controleert op objecten die niet meer worden gebruikt door de
sollicitatie. Als het een object in aanmerking neemt voor vernietiging,
roept de destructor aan (indien aanwezig) en herstelt het geheugen dat is gebruikt om op te slaan
het object. Destructors worden ook aangeroepen wanneer het programma wordt afgesloten. Het is
mogelijk om het ophalen van afval te forceren door Collect te bellen, maar de meeste
de tijd, moet dit worden vermeden omdat het prestaties kan opleveren
problemen.


Antwoord 2, autoriteit 78%

In C#-termen zijn een destructor en finalizer in principe uitwisselbare concepten en moeten ze worden gebruikt om onbeheerdebronnen vrij te geven wanneer een type wordt verzameld, bijvoorbeeld externe handvatten. Het is zeerzeldzaam dat u een finalizer moet schrijven.

Het probleem daarmee is dat GC niet-deterministisch is, dus de Dispose()-methode (via IDisposable) maakt het mogelijk om deterministischeopruimen. Dit heeft niets te maken met het verzamelen van afval en stelt de beller in staat om bronnen eerdervrij te geven. Het is ook geschikt voor gebruik met beheerdebronnen (naast onbeheerde), bijvoorbeeld als u een type heeft dat inkapselt(bijvoorbeeld) een databaseverbinding, wilt u misschien van het type om ook de verbinding te verbreken.

Other episodes