Ich bin etwas verwirrt über die Verwendung von Destruktor in c #. In meinem Wissen können wir nicht anrufen Destruktor nach meinem Wunsch wird es automatisch vor Garbage Collector für die Durchführung einiger Arbeiten über Klasse (Objekt) aufrufen, also möchte ich fragen, ob wir Destruktor in c # verwenden, dann müssen wir auf Garbage Collector. Wie ich weiß, dass Destruktor kann sich um Speicher kümmern, warum müssen wir Garbage Collector?
Jeder denkt über die falsche Garbage-Collection nach :
Ein korrekt geschriebenes Programm kann nicht gehe davon aus, dass Finalizer jemals laufen werden.
Ich denke, basierend auf Ihrem fast doppeltem Thema , das Sie nicht gut verstehen wie der Garbage Collector funktioniert. In sehr kurzer und stumpfer Weise ist es ein eigener Dienst, der im Hintergrund läuft und den Speicher für unbenutzte und entsorgte Objekte während der gesamten Lebensdauer Ihrer Anwendung verfolgt und freigibt. Realistisch gesehen sollten Sie nie den GC selbst anrufen, außer in sehr seltenen und speziellen Fällen.
Die Destruktoren werden zum Bereinigen und Freigeben von nicht verwalteten Ressourcen verwendet, die nicht vom Garbage Collector freigegeben werden können, siehe MSDN Seite für weitere Informationen über Destruktoren.
Es wäre auch nützlich, über den korrekten Weg zu lesen IDisposable Muster zu implementieren. Es gibt viel mehr als das, was wir denken -
Der Destruktor dient nicht zum Bereinigen von verwaltetem Speicher. Dafür ist der Garbage Collector gedacht. Der Destruktor dient zum Bereinigen anderer Ressourcen wie z. B. Handles.
Ich empfehle, dass Sie sich CLR über C # für Details, wie das funktioniert.
Ich denke, die Verwirrung rührt von der Tatsache her, dass Sie Objekte sowohl deterministisch als auch nicht-deterministisch entsorgen können (d. h. wenn der GC dazu kommt).
Um Ihre Fragen zu beantworten, warum wir überhaupt einen GC benötigen, würde ich sagen, sogar wenn Speicherlecks wegfallen, dass GCs ziemlich performant sind und eine Forderung nach sofortiger Speicherwiederherstellung tatsächlich die Gesamtleistung des Systems verringern könnte . Es ist ein ähnliches Argument für die Single-vs-Multi-Threading-Debatte.
Destruktoren in C # sollten sehr selten verwendet werden. In einigen Fällen haben Sie jedoch keine Wahl.
Wenn Sie zum Beispiel eine Singleton-Klasse für die Protokollierung haben und aus Gründen der Performanz nicht mit autoflush arbeiten können, sollte das Löschen eines Puffers während der Finalisierung des Singleton berücksichtigt werden.
Tags und Links .net c# destructor