Was ist der Unterschied zwischen einem Destruktor und einer Finalize-Methode in einer Klasse, wenn es einen gibt?In C# Was ist der Unterschied zwischen einem Destruktor und einer Finalize-Methode in einer Klasse?
Ich habe kürzlich entdeckt, dass Visual Studio 2008 einen Destruktor als Synonym für eine Finalize-Methode ansieht, was bedeutet, dass Sie in Visual Studio nicht beide Methoden gleichzeitig in einer Klasse definieren können.
Zum Beispiel das folgende Codefragment:
class TestFinalize
{
~TestFinalize()
{
Finalize();
}
public bool Finalize()
{
return true;
}
}
gibt die folgenden Fehler auf dem Anruf im Destruktor finalisieren:
The call is ambiguous between the following methods or properties: 'TestFinalize.~TestFinalize()' and 'TestFinalize.Finalize()'
Und wenn der Anruf, es zu finalisieren kommentiert out gibt die folgende Fehlermeldung:
Type 'ManagementConcepts.Service.TestFinalize' already defines a member called 'Finalize' with the same parameter types
'Sie sollten nur eine Finalize-Methode implementieren, um nicht verwaltete Ressourcen zu bereinigen': Sie setzen es in Finalize. Das gleiche gilt für Dispose? – hqt
@hqt: Fälle, in denen "Dispose" implementiert werden sollte, sind weitaus größer als diejenigen, bei denen ein Finalizer implementiert werden sollte. Implementieren Sie "Dispose", wenn es wahrscheinlich ist, dass eine Instanz der Klasse oder einer abgeleiteten Klasse das letzte Ding ist, das direkt eine nicht verwaltete Ressource besitzt oder direkt das letzte besitzt, um direkt eine nicht verwaltete Ressource zu besitzen, oder direkt das letzte Ding besitzt direkt zu besitzen usw. Implementieren Sie 'Finalize' nur für die Ressourcenbereinigung, wenn die Klasse direkt eine nicht verwaltete Ressource besitzt und fast nichts anderes - ein viel engeres Szenario. – supercat
@hqt: Wenn eine Klasse direkt nicht verwaltete Ressourcen besitzt und Referenzen auf andere Objekte enthält, sollten die nicht verwalteten Ressourcen in der Regel in ihre eigene finalisierbare Klasse aufgeteilt werden (die idealerweise keine starken Referenzen auf irgendetwas anderes enthalten sollte) Eine Klasse, die Verweise auf andere Objekte enthält, würde nur "Dinge besitzen, die direkt nicht verwaltete Ressourcen besitzen", anstatt die Ressourcen selbst zu besitzen, und würde somit keinen Finalizer benötigen. – supercat