2008-10-09 18 views

Antwort

169

~ ist die destructor

  1. Destructors automatisch aufgerufen werden, und nicht explizit aufgerufen werden kann.
  2. Destruktoren können nicht überlastet werden. Daher kann eine Klasse höchstens einen Destruktor haben.
  3. Destruktoren werden nicht vererbt. Daher hat eine Klasse keine anderen Destruktoren als die eine, die darin deklariert werden kann.
  4. Destruktoren können nicht mit Strukturen verwendet werden. Sie werden nur mit Klassen verwendet. Eine Instanz kann vernichtet werden, wenn Code nicht mehr für die Instanz verwendet werden kann.
  5. Die Ausführung des Destruktors für die Instanz kann jederzeit erfolgen, nachdem die Instanz für die Zerstörung infrage kommt.
  6. Wenn eine Instanz zerstört wird, werden die Destruktoren in ihrer Vererbungskette in der Reihenfolge von den meisten abgeleiteten zu den am wenigsten abgeleiteten aufgerufen.

Finalisierung

In C#, führt die Finalisierung Verfahren die Operationen, die ein Standard-C++ destructor tun würde. In C# nennen Sie es nicht Finalize - Sie verwenden die C++ - Destruktorsyntax, indem Sie ein Tilde (~) vor dem Namen der Klasse platzieren.

Entsorgen

Es wird bevorzugt von Objekten in einer Close() oder Dispose() Methode zu verfügen, die explizit durch den Benutzer der Klasse aufgerufen werden kann. Finalize (Destruktor) werden vom GC aufgerufen.

Die Schnittstelle IDisposable teilt der Welt mit, dass Ihre Klasse Ressourcen enthält, die entsorgt werden müssen, und bietet Benutzern die Möglichkeit, sie zu veröffentlichen. Wenn Sie in Ihrer Klasse einen Finalizer implementieren müssen, sollte Ihre Dispose-Methode die Methode GC.SuppressFinalize() verwenden, um sicherzustellen, dass die Finalisierung Ihrer Instanz unterdrückt wird.

Was zu verwenden?

Es ist nicht erlaubt, einen Destruktor explizit aufzurufen. Ihr Destruktor wird vom Garbage Collector aufgerufen. Wenn Sie wertvolle nicht verwaltete Ressourcen (z. B. Dateihandles) verwalten, die Sie so schnell wie möglich schließen und löschen möchten, sollten Sie die IDisposable-Schnittstelle implementieren.

+1

Ich weiß nicht, wie es früher war. Aber jetzt werden Destruktoren vererbt. Überprüfen Sie diesen Link für weitere Informationen (siehe das Beispiel am Ende): http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx – RononDex

+0

@RononDex Punkt 3 der gleichen Seite, die Sie mit den Staaten verknüpfen * "Finalizer kann nicht vererbt werden "*, was Ihrem Kommentar widerspricht. Es ist zugegebenermaßen ein wenig verwirrend, da sie zwar nicht vererbt werden können, aber die "Finalize" -Methode rekursiv für alle Instanzen in der Vererbungskette aufgerufen wird, von den am meisten abgeleiteten zu den am wenigsten abgeleiteten "*". Beachten Sie, dass das * nicht * das gleiche Verhalten ist wie bei vererbbaren Destruktoren. –

+0

@MarkAmery ah Ich sehe, also im Grunde werden sie in der umgekehrten Reihenfolge aufgerufen, im Vergleich zu etwas, das vererbt wird? – RononDex

7

Es wird verwendet, um den Destruktor für die Klasse anzugeben.

+1

In C#, die korrekte Bezeichnung ist "Finalizerthread", nicht "destructor". –

+11

Sie sind beide korrekt, abhängig davon, welche C# -Spezifikation Sie gelesen haben. Die neueste MS-Version (vereinheitlichtes C# 3.0) bezeichnet sie als Destruktoren (z.B. Abschnitt 10.13), aber die ECMA-Spezifikation bezieht sich auf diese als Finalizer. –

+0

@ 1800INFORMATION: Das * syntaktische Element * wird richtig als Destruktor bezeichnet. Wenn eine Klasse einen Destruktor hat, generiert ein C# -Compiler automatisch einen Finalizer, der einen allgemein nutzlosen 'try/finally'-Block enthält, der sicherstellt, dass die übergeordnete' Finalize'-Methode aufgerufen wird. Die meisten Dinge, die für Destruktoren zutreffen, gelten für Finalisten und umgekehrt, aber die Wörter bedeuten etwas anderes. – supercat

4

Wie C++, es ist der Destruktor; In C# wird es jedoch nicht explizit aufgerufen. Es wird aufgerufen, wenn das Objekt erfasst wird.

2

~ steht normalerweise für einen Dekonstruktor. welches direkt vor dem Tod eines Objekts ausgeführt wird.

Here is a description of C# deconstructors i found

+1

der richtige Begriff sollte Destruktor/Finalizer, nicht Dekonstruktor sein. Dekonstruktor bedeutet eine Syntax zum Dekonstruieren eines Konstruktors. –

40

Dies ist ein finalizer. Um ehrlich zu sein, sollten Sie sehr selten einen Finalizer schreiben müssen. Sie müssen wirklich nur um einen schreiben, wenn:

  • Sie direkten Zugriff auf eine nicht verwaltete Ressource (zB durch eine IntPtr) und Sie können SafeHandle nicht benutzen, die es einfacher macht
  • Sie IDisposable in einer Klasse implementieren das ist nicht versiegelt. (Meine Präferenz besteht darin, Klassen zu versiegeln, sofern sie nicht für die Vererbung ausgelegt sind.) In solchen Fällen ist ein Finalizer Teil des kanonischen Dispose-Musters.
3

Siehe Destructors (C# Programming Guide). 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.

-1

Ein Punkt auf dem Finalizer oben, auf die Situation, die Sie möglicherweise anrufen müssen. Sie benötigen sie, um nicht verwaltete Ressourcen freizugeben, die üblicher sind, als Sie normalerweise für Datenbanken erwarten. SQLConnection ist ein Beispiel, bei dem Sie immer Dispose() aufrufen sollten, wenn Sie damit fertig sind.

Ein Artikel: http://www.codeproject.com/KB/cs/idisposable.aspx