Frage

GC ist für verwaltete Objekte und Finalisierung ist für nicht verwaltete Objekte das ist, was ich gelesen habe. Entsorgen ist implizit und Finalisierung ist Explicit ist, was ich lesen gewesen. Kann jemand geben Sie mir ein Beispiel für ein Modul, in dem alle drei, was aus verschiedenen Gründen verwendet wurden?

War es hilfreich?

Lösung

GC ist Garbage Collection. Es ist die automatische Speicherverwaltung, dass Griffe Bereinigung von Objekten auf dem verwalteten Heap zugewiesen. Das .NET GC setzt eine Markierung und Sweep-Algorithmus. Wenn eine Garbage Collection auftritt hält es für grundsätzlich alle Objekt in dem Teil des Haufens als erstattungsfähige gereinigt werden. Dann geht es durch eine Markierung Prozess, in dem es für die Wurzeln durchsucht. D. h es identifiziert Objekte, die noch in Gebrauch durch die Anwendung sind. Nachdem dies erledigt, dass die verbleibenden Objekte für die Bereinigung in Frage kommen. Der Heap kann als Teil der Bereinigung verdichtet werden.

Entsorgen und Finalizerthread Methoden bieten beide eine Option für die Reinigung von Ressourcen, die nicht von GC behandelt. Z.B. Dies könnte nativen Griffe und dergleichen sein. Sie haben nichts zu tun mit auf dem verwalteten Heap-Speicher Rückgewinnung.

Entsorgen Sie müssen explizit auf eine Art, die IDisposable implementieren aufgerufen werden. Es kann entweder durch die Dispose() Methode selbst oder über das using Konstrukt bezeichnet werden. Die GC wird nicht rufen Dispose automatisch.

Ein Finalizerthread oder destructor (wie die Sprachspezifikation es nennt) auf der anderen Seite wird automatisch aufgerufen werden irgendwann , nachdem das Objekt für die Bereinigung berechtigt war. Finalisierung Methoden werden nacheinander auf einem dedizierten Thread ausgeführt.

ermöglicht Dispose() determinis Bereinigung von Ressourcen, während ein Finalizerthread als Sicherheitsnetz dienen kann, falls der Benutzer nicht Dispose() nicht nennen.

Wenn ein Typ implementiert eine Finalizerthread, Bereinigung von Instanzen als Finalizerthread verzögert wird, muss vor der Bereinigung aufgerufen werden. D. h es wird eine zusätzliche collect erfordern den Speicher für Instanzen des Typs zurückzufordern. Wenn die Art Geräte als auch IDisposable kann die Dispose-Methode aufgerufen werden, und dann kann die Instanz entfernt sich von der Finalisierung. Dadurch wird das Objekt erlaubt so gereinigt werden, wenn sie nicht einen Finalizer haben.

Wenn Sie in diese graben wollen, empfehle ich CLR via C # von Jeffrey Richter . Es ist ein großes Buch, und es deckt alle blutigen Details dieses (ich hinterließ eine Reihe von Details aus). Die neue 3. Auflage ist soeben erschienen.

Andere Tipps

Einer der Vorteile von .NET ist die Garbage Collector. In vielen Sprachen, muss jeder Teil des Speichers durch die Entwickler- sollte jeder zugewiesenen Speicher verwaltet wird schließlich freigegeben werden. In .NET (C #), der Garbage Collector (GC) wird der Prozess für Sie Erinnerung an die Freigabe kümmern. Es verfolgt die Verwendung der Objekte, und nachdem sie „unbewurzelten“ werden. (Dh: es gibt keine Referenzen in Ihrer Anwendung auf das Objekt, direkt oder indirekt), den Speicher des Objekts automatisch nach oben gereinigt

Entsorgen oder insbesondere IDisposable und das Entsorgen Muster werden verwendet, Ressourcen aus dem GC separat zu behandeln. Einige Ressourcen müssen in die gereinigt explizit , aus verschiedenen Gründen. Dazu gehört auch eine „native“ API (wo .NET nicht über den zugewiesenen Speicher wissen), eine Ressource verwenden, die nativen Griffe Wraps, etc. Um diese sauber zu handhaben, Sie IDisposable und das Entsorgen Muster implementieren.

Die Finalisierung tritt auf Objekte, wenn sie etwa vom Garbage Collector gesammelt werden. Dies stellt ein „Sicherheitsnetz“, wo durch ein Objekt, das noch entsorgt werden sollte gereinigt werden, wenn auch ein wenig später als ideal. Durch einen Finalizer Implementierung können Sie nicht verwalteten Ressourcen garantieren immer freigegeben.

Das Problem bei den meisten Proben ist, dass es mehrere Gründe IDisposable zu verwenden, und die ordnungsgemäße Umsetzung unterscheidet sich je nach dem Grund, warum Sie es verwenden. Zum Beispiel, wenn Sie eine native Ressource direkt wickeln, sollten Sie einen Finalizer implementieren, aber wenn Sie eine andere Art IDisposable einkapseln, ein Finalizerthread ist nicht notwendig, auch wenn Sie noch IDisposable implementieren sollten. Um dies zu lösen, habe ich geschrieben über IDisposable und Finalisierung in der Tiefe auf meinem Blog , beschreibt die mehrere Gründe, die Sie verwenden würden IDisposable, und verschiedene Muster aus unterschiedlichen Gründen.

Sie können möchte nur lesen, was ich den definitiven Artikel über IDisposable, Finalizer und Müllabfuhr, Shawn Farkas' CLR Inside Out:. Digging in IDisposable

Diese Artikel Blätter sehr wenig Zweifel über das Thema.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top