In Programmiersprachen kann ein Objekt nur während seines Bestehens variabel sein. Nach der Instantiierung kann es nicht mehr geändert werden. Daher kann dieselbe Speicherzelle nicht neuen Werten zugewiesen werden. Daher ist eine Art automatisierte Speicherverwaltung erforderlich, um die nicht verwendeten Speicherplätze zu verwalten. Diese ungenutzten Speicherplätze werden als Müll bezeichnet, und der gesamte Prozess der effizienten Speicherverwaltung wird als Garbage Collection bezeichnet.
Das Hauptziel eines Müllsammlers besteht darin, die toten Objekte von den Live-Objekten zu trennen und den Platz für die Wiederverwendung zurückzugewinnen. Grundsätzlich funktioniert das Ganze auf einem verwalteten Heap, der nichts weiter als ein Speicherblock ist, und der Garbage Collector überprüft regelmäßig den Heap-Speicher, um neuen Objekten Speicher zuzuweisen. Es gibt zwei Methoden, um nicht verwaltete Ressourcen wie Dateien und Datenbankverbindungen freizugeben: Dispose und Finalize.
Dieser Artikel hilft Ihnen, den Unterschied zwischen den beiden zu verstehen.
Dispose ist eine Standardmethode, mit der Benutzer Objekten mitteilen können, dass sie ihre Ressourcen freigeben und nicht erneut versuchen, auf die Objekte zuzugreifen. Die Dispose-Methode ermöglicht die Kontrolle der expliziten Speicherbereinigung, indem die Objekte unbrauchbar gemacht werden.
Wenn der Benutzer die Dispose () -Methode aufruft, soll das Objekt all seine teuren Ressourcen freigeben und somit für die Wiederverwendung verfügbar machen. Es wird nie vom Garbage Collector aufgerufen, der nur abgespielt wird, wenn der verwaltete Speicher knapp wird. Über eine spezielle Schnittstelle namens "IDisposable" wird festgelegt, wo und wie Dispose () implementiert wird. Was passiert aber, wenn die dispose-Methode nicht aufgerufen wird??
Wenn die dispose-Methode nicht aufgerufen wird, besteht der Fallback-Plan darin, die Finalize () - Methode für die Bereinigung zu verwenden. Es wird vom Garbage Collector aufgerufen, um eine letzte Ressourcenbereinigung durchzuführen, bevor Speicher freigegeben wird. Das Konzept der zeitgerechten Bereinigung wird hier nicht mehr angewendet, da der Speicher nicht sofort aufgehoben wird, sondern das Objekt der Finalisierungswarteschlange hinzugefügt wird, um es später zu löschen. Finalize ist eher eine Sicherheitsmaßnahme, die im Falle eines Programmierfehlers eingerichtet wurde, und der Dispose-Server bereinigt die Ressourcen nicht. In diesem Fall wird die Finalize () - Methode vom Garbage Collector aufgerufen, um nicht erreichbare Objekte in beliebiger Reihenfolge zu entfernen.
Die Dispose-Methode wird aufgerufen, um die Freigabe nicht verwalteter Ressourcen wie Datenbank-Handles, Datei-Handles, Semaphore und andere vom Betriebssystem zugewiesene Objekte zu beschleunigen. Die dispose-Methode wird aufgerufen, um den Code auszuführen, der zum Bereinigen von nicht verwendetem Speicher und knappen Ressourcen wie GDI-Handles erforderlich ist. In einfachen Worten bietet die Dispose-Methode die Kontrolle der expliziten Speicherbereinigung. Die Finalize-Methode ist dagegen Teil der Garbage Collection, die zur endgültigen Bereinigung eines Objekts verwendet wird, bevor dieses gesammelt wird. Die finalize-Methode wird einfach aufgerufen, um nicht verwaltete Ressourcen freizugeben, die sich in einem Objekt befinden, bevor es zerstört wird.
Die Dispose-Methode kann explizit durch den Benutzercode und die Klasse aufgerufen werden, die die Methode zum Entsorgen von Ressourcen implementiert. Der Speicher kann jedoch erst freigegeben werden, wenn der Garbage Collector den Bereinigungsprozess durchführt. Die Methode kann auch aufgerufen werden, wenn noch andere Verweise auf das Objekt vorhanden sind. Die finalize-Methode kann dagegen vom Garbage Collector nur aufgerufen werden, nachdem festgestellt wurde, dass die letzte Speicherobjektinstanz zerstört wurde und keine Verweise mehr auf das Objekt vorhanden sind. Nachdem die Finalize-Methode ausgeführt wurde, wird das Objekt aus dem Heap-Speicher entfernt.
Das Disponieren eines Objekts aus dem Speicher wird als Dispose-Muster bezeichnet. Dieses Muster kann für Objekte verwendet werden, die auf nicht verwaltete Ressourcen zugreifen, da der Garbage Collector nicht verwaltete Ressourcen nicht abrufen kann. Die "IDisposable" -Schnittstelle wird zusammen mit einer zusätzlichen Dispose-Methode (Boolean) implementiert, in der die Freigabe nicht verwalteter Ressourcen gefordert wird. Eine Finalize-Methode wird ausgeführt, wenn die Instanz eines Objekts vor seiner Freigabe gelöscht wird. Es ist eine nicht deterministische Methode, die im Ermessen des Speicherbereinigers abläuft und möglicherweise nicht einmal vorkommt. Es sollte nicht auf verwalteten Objekten implementiert werden, wenn es äußerst notwendig ist.
Es ist viel schneller, eine Entsorgungsmethode zu verwenden, als die sofortige Entsorgung von Objekten abzuschließen. Destruktoren werden zur Laufzeit automatisch in die Finalize-Methode konvertiert. Sie wird automatisch vom Garbage Collector aufgerufen, wenn das Objekt den Gültigkeitsbereich verlässt. Dies geschieht normalerweise, wenn die Instanz dieses Objekts zerstört wird. Das Problem bei der finalize-Methode ist, dass es nicht deterministisch ist. Dies bedeutet, dass es nicht sicher ist, Speicher zurückzugewinnen, auf den nicht mehr über die Garbage Collection verwiesen wird. Es wird jedoch möglicherweise nicht sofort Speicherplatz freigegeben. In der Tat kann es nie aufgerufen werden und es kann nicht explizit erzwungen werden.
Der Hauptunterschied zwischen Dispositions- und Finalisierungsmethoden besteht darin, dass die erstgenannte Methode eine deterministische Methode ist, bei der Objekte sofort entsorgt werden, wenn sie nicht mehr verwendet werden. Die letztere Methode ist eine nicht deterministische Methode zum Zuordnen nicht verwalteter Ressourcen Speicherobjektinstanzen, wenn sie vor ihrer Freigabe nicht mehr in den Gültigkeitsbereich wechseln. Es ist immer ratsam, die Dispose-Methode über finalize zu verwenden, sofern dies nicht unbedingt erforderlich ist.
Mit anderen Worten, finalize ist eine Sicherheitsmaßnahme, um nicht verwaltete Ressourcen zu bereinigen, wenn die dispose-Methode im Falle eines Programmierfehlers nicht aufgerufen werden kann. Die Finalize-Methode wird vom Garbage Collector aufgerufen, wenn ein Objekt aus dem Heap-Speicher geworfen wird.