~ ist der Destruktor
- Destruktoren werden automatisch aufgerufen und können nicht explizit aufgerufen werden.
- Destruktoren können nicht überladen werden. Somit kann eine Klasse höchstens einen Destruktor haben.
- Destruktoren werden nicht vererbt. Eine Klasse hat also keine anderen Destruktoren als die, die darin deklariert werden können.
- Destruktoren können nicht mit Strukturen verwendet werden. Sie werden nur mit Klassen verwendet. Eine Instanz kann zerstört werden, wenn kein Code mehr die Instanz verwenden kann.
- Die Ausführung des Destruktors für die Instanz kann jederzeit erfolgen, nachdem die Instanz zur Zerstörung berechtigt ist.
- Wenn eine Instanz zerstört wird, werden die Destruktoren in ihrer Vererbungskette in der Reihenfolge von am meisten abgeleitet bis am wenigsten abgeleitet aufgerufen.
Finalisieren
In C # führt die Finalize-Methode die Operationen aus, die ein Standard-C ++ - Destruktor ausführen würde. In C # nennen Sie es nicht Finalize - Sie verwenden die C ++ - Destruktorsyntax, um ein Tilde-Symbol (~) vor dem Namen der Klasse zu platzieren.
Entsorgen
Es ist vorzuziehen, Objekte in einer Close()
oder Dispose()
Methode zu entsorgen , die vom Benutzer der Klasse explizit aufgerufen werden kann. Finalize (Destruktor) werden vom GC aufgerufen.
Die IDisposable- Oberfläche teilt der Welt mit, dass Ihre Klasse über Ressourcen verfügt, die entsorgt werden müssen, und bietet Benutzern die Möglichkeit, diese freizugeben. Wenn Sie brauchen einen Finalizer in Ihrer Klasse zu implementieren, Ihre Dispose - Methode sollte die Verwendung GC.SuppressFinalize()
Methode , um sicherzustellen , dass die Finalisierung Ihrer Instanz unterdrückt wird.
Was ist zu verwenden?
Es ist nicht legal, einen Destruktor explizit aufzurufen. Ihr Destruktor wird vom Garbage Collector aufgerufen. Wenn Sie wertvolle nicht verwaltete Ressourcen (z. B. Dateihandles) verarbeiten, die Sie schließen und so schnell wie möglich entsorgen möchten, sollten Sie die IDisposable-Schnittstelle implementieren.
Patrick Desjardins
quelle
Finalize
Methode für alle Instanzen in der Vererbungskette rekursiv aufgerufen, von den am meisten abgeleiteten bis zu den am wenigsten abgeleiteten" . Beachten Sie jedoch, dass dies nicht das gleiche Verhalten ist, das Sie von vererbbaren Destruktoren erhalten würden.Dies ist ein Finalizer . Um ehrlich zu sein, sollten Sie sehr selten einen Finalizer schreiben müssen. Sie müssen wirklich nur eine schreiben, wenn:
IntPtr
) und können diese nicht verwenden,SafeHandle
was die Arbeit erleichtertIDisposable
in einer Klasse, die nicht versiegelt ist. (Ich bevorzuge es, Klassen zu versiegeln, es sei denn, sie sind für die Vererbung vorgesehen.) In solchen Fällen ist ein Finalizer Teil des kanonischen Entsorgungsmusters.quelle
Es wird verwendet, um den Destruktor für die Klasse anzugeben.
quelle
try/finally
Block enthält, der sicherstellt, dass die übergeordneteFinalize
Methode aufgerufen wird. Die meisten Dinge, die für Destruktoren gelten, gelten für Finalisierer und umgekehrt, aber die Wörter bedeuten etwas andere Dinge.Genau wie C ++ ist es der Destruktor. In C # wird es jedoch nicht explizit genannt. Es wird aufgerufen, wenn das Objekt gesammelt wird.
quelle
Siehe Destruktoren (C # -Programmierhandbuch) . Beachten Sie jedoch, dass der Programmierer im Gegensatz zu C ++ keine Kontrolle darüber hat, wann der Destruktor aufgerufen wird, da dies vom Garbage Collector bestimmt wird.
quelle
~ repräsentiert normalerweise einen Dekonstruktor. Dies wird ausgeführt, bevor ein Objekt stirbt.
Hier ist eine Beschreibung der C # -Dekonstruktoren, die ich gefunden habe
quelle