Beispielsweise:
public class Person
{
public Person()
{
}
~Person()
{
}
}
Wann sollte ich manuell einen Destruktor erstellen? Wann mussten Sie einen Destruktor erstellen?
c#
destructor
David Heffernan
quelle
quelle
Antworten:
UPDATE: Diese Frage war das Thema meines Blogs im Mai 2015 . Danke für die tolle Frage! Im Blog finden Sie eine lange Liste von Unwahrheiten, die die Leute allgemein über die Finalisierung glauben.
Fast nie.
Normalerweise erstellt man einen Destruktor nur, wenn Ihre Klasse an einer teuren nicht verwalteten Ressource festhält, die bereinigt werden muss, wenn das Objekt verschwindet. Es ist besser, das Einwegmuster zu verwenden, um sicherzustellen, dass die Ressource bereinigt wird. Ein Destruktor ist dann im Wesentlichen eine Garantie dafür, dass die Ressource letztendlich immer noch bereinigt wird, wenn der Verbraucher Ihres Objekts vergisst, es zu entsorgen. (Vielleicht.)
Wenn Sie einen Destruktor erstellen, seien Sie äußerst vorsichtig und verstehen Sie, wie der Garbage Collector funktioniert . Zerstörer sind wirklich komisch :
Fast nichts, was normalerweise wahr ist, ist in einem Destruktor wahr. Sei wirklich sehr, sehr vorsichtig. Das Schreiben eines korrekten Destruktors ist sehr schwierig.
Beim Testen des Teils des Compilers, der Destruktoren verarbeitet. Ich musste dies im Produktionscode nie tun. Ich schreibe selten Objekte, die nicht verwaltete Ressourcen manipulieren.
quelle
Es wird als "Finalizer" bezeichnet, und Sie sollten normalerweise nur einen für eine Klasse erstellen, deren Status (dh: Felder) nicht verwaltete Ressourcen enthält (dh: Zeiger auf Handles, die über p / invoke-Aufrufe abgerufen werden). In .NET 2.0 und höher gibt es jedoch einen besseren Weg, um mit der Bereinigung nicht verwalteter Ressourcen umzugehen : SafeHandle . Vor diesem Hintergrund sollten Sie so gut wie nie wieder einen Finalizer schreiben müssen.
quelle
Sie benötigen keine, es sei denn, Ihre Klasse verwaltet nicht verwaltete Ressourcen wie Windows-Dateihandles.
quelle
Es wird als Destruktor / Finalizer bezeichnet und normalerweise beim Implementieren des Disposed-Musters erstellt.
Es ist eine Fallback-Lösung, wenn der Benutzer Ihrer Klasse vergisst, Dispose aufzurufen, um sicherzustellen, dass (irgendwann) Ihre Ressourcen freigegeben werden, Sie jedoch keine Garantie dafür haben, wann der Destruktor aufgerufen wird.
In dieser Stapelüberlauffrage zeigt die akzeptierte Antwort korrekt, wie das Entsorgungsmuster implementiert wird. Dies ist nur erforderlich, wenn Ihre Klasse nicht gehandelte Ressourcen enthält, die der Garbage Collector nicht selbst bereinigen kann.
Es wird empfohlen, keinen Finalizer zu implementieren, ohne dem Benutzer der Klasse die Möglichkeit zu geben, das Objekt manuell zu entsorgen, um die Ressourcen sofort freizugeben.
quelle
Wenn Sie nicht verwaltete Ressourcen haben und sicherstellen müssen, dass diese bereinigt werden, wenn Ihr Objekt verschwindet. Ein gutes Beispiel wären COM-Objekte oder File Handler.
quelle
Ich habe einen Destruktor (nur zu Debugzwecken) verwendet, um festzustellen, ob ein Objekt im Rahmen einer WPF-Anwendung aus dem Speicher gelöscht wurde. Ich war mir nicht sicher, ob die Speicherbereinigung das Objekt wirklich aus dem Speicher löscht, und dies war eine gute Möglichkeit, dies zu überprüfen.
quelle
Destruktoren bieten eine implizite Möglichkeit, nicht verwaltete Ressourcen in Ihrer Klasse freizugeben. Sie werden aufgerufen, wenn der GC dazu kommt, und sie rufen implizit die Finalize-Methode der Basisklasse auf. Wenn Sie viele nicht verwaltete Ressourcen verwenden, ist es besser, eine explizite Möglichkeit zum Freigeben dieser Ressourcen über die IDisposable-Schnittstelle bereitzustellen. Weitere Informationen finden Sie im C # -Programmierhandbuch: http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx
quelle