In C #, was ist der Unterschied zwischen einem destructor und einer Finalize-Methode in einer Klasse?
-
21-08-2019 - |
Frage
Was ist der Unterschied, wenn es eine gibt, zwischen einem destructor und einer Finalize-Methode in einer Klasse ist?
Vor kurzem habe ich entdeckt, dass Visual Studio 2008 eine destructor gleichbedeutend mit einer Finalize-Methode betrachtet, was bedeutet, dass Visual Studio werden Sie gleichzeitig nicht zulassen, beide Methoden in einer Klasse definiert werden.
Zum Beispiel das folgende Codefragment:
class TestFinalize
{
~TestFinalize()
{
Finalize();
}
public bool Finalize()
{
return true;
}
}
Gibt die folgenden Fehler auf dem Anruf im Destruktor finalisieren:
Der Aufruf ist nicht eindeutig zwischen den folgenden Methoden oder Eigenschaften: 'TestFinalize. ~ TestFinalize ()' und 'TestFinalize.Finalize ()
Und wenn der Anruf kommentiert finalisieren aus, es gibt die folgenden Fehler:
Typ ‚ManagementConcepts.Service.TestFinalize‘ definiert bereits ein Mitglied namens ‚Finalisieren‘ mit den gleichen Parametertypen
Lösung
Ein destructor in C # überschreibt System.Object.Finalize
Methode. Sie müssen Verwendung destructor Syntax, dies zu tun. Manuelles Überschreiben Finalize
erhalten Sie eine Fehlermeldung geben.
Im Grunde, was Sie versuchen, mit Ihrer Finalize
Methodendeklaration zu tun ist,
Andere Tipps
Wikipedia hat einige gute Diskussion über den Unterschied zwischen einem Finalizerthread und einem destructor in den Finalizerthread Artikeln.
C # wirklich nicht über eine "echte" destructor. Die Syntax ähnelt einem C ++ destructor, aber es ist wirklich ein Finalizerthread. Sie schrieb es richtig im ersten Teil Ihres Beispiel:
~ClassName() { }
Die oben ist syntaktischer Zucker für eine Finalize
Funktion. Sie stellt sicher, dass die Finalizers in der Basis ausgeführt werden garantiert, ist aber ansonsten identisch mit Überschreiben der Finalize
Funktion. Dies bedeutet, dass, wenn Sie die destructor Syntax schreiben, du bist wirklich die Finalizerthread zu schreiben.
Laut Microsoft , bezieht sich der Finalizer auf die Funktion, die das Garbage Collector ruft, wenn es sammelt (Finalize
), während der destructor ist Ihr Stück Code, der als Ergebnis führt (der syntaktische Zucker, die Finalize
wird). Sie sind so nahe die gleiche Sache ist, dass Microsoft sollte nie den Unterschied gemacht hat.
Microsofts Verwendung des C ++ 's ‚destructor‘ Begriff ist irreführend, weil in C ++ auf dem gleichen Thread ausgeführt wird, sobald das Objekt gelöscht wird oder von dem Stapel genommene, während in C # ist es bei einem anderen auf einem separaten Thread ausgeführt Zeit.
Destructor
Sie sind spezielle Methoden, die für das Objekt bereinigen Code enthält. Sie können sie nicht explizit in Ihrem Code aufrufen, wie sie genannt werden implizit durch GC. In C # haben sie denselben Namen wie der Name Klasse voran durch das
~
Zeichen. Wie -Class MyClass { ~MyClass() { ..... } }
In VB.NET werden Destruktoren durch Überschreiben der Finalize umgesetzt Verfahren der System.Object-Klasse.
Entsorgen
Diese wie alle anderen Methoden in der Klasse und können aufgerufen werden explizit, aber sie haben einen besonderen Zweck, die Aufgabe der Reinigung. In der dispose-Methode schreiben wir Code für das Objekt aufzuräumen. Es ist wichtig, dass wir frei geworden alle nicht verwalteten Recourcen in den dispose Verfahren wie die Datenbankverbindung, Dateien usw. Die Klasse Umsetzung entsorgen Methode sollte IDisposable Dispose-Methode implementieren Grenzfläche sollte die GC.SuppressFinalize Methode für das Objekt aufrufen es ist Anordnen, wenn die Klasse desturctor hat, weil es bereits getan hat die arbeiten, um das Objekt zu bereinigen, dann ist es nicht für den Müll notwendig Sammler rufen Sie das Finalize-Methode des Objekts. Referenz: http://msdn2.microsoft.com/en-us /library/aa720161(VS.71).aspx
Finalisierung
Eine Finalize-Methode wirkt als Schutz Ressourcen in dem aufzuräumen Falls Ihre Dispose-Methode wird nicht aufgerufen. Sie sollten nur eine Finalize-Methode implementieren nicht verwalteten Ressourcen zu bereinigen. Sie sollten keine Finalize-Methode für verwaltete Objekte implementieren, weil die Garbage Collector reinigt verwalteten Ressourcen automatisch. Finalisieren Methode wird von der GC genannt implizit daher kann man nicht nennt es aus dem Code.
Hinweis: In C # finalisieren Methode nicht überschreiben kann, so müssen Sie verwenden destructor interne Implementierung dessen wird außer Kraft setzen die Finalisieren Verfahren in MSIL.But im VB.NET, Verfahren zum Abschluss bringen kann außer Kraft setzen, weil es Destruktormethode unterstützt.
Update:. Interessant halbbezogene Thread hier