it-swarm.com.de

Was bedeutet die Tilde vor einem Funktionsnamen in C #?

Ich sehe mir einen Code an, der die folgende Aussage enthält:

~ConnectionManager()
{
    Dispose(false);
}

Die Klasse implementiert die Schnittstelle IDisposable, aber ich weiß nicht, ob dies Teil der Tilde ist, für die die Tilde (~) verwendet wird.

148
Keith Sirmons

~ ist der Destruktor

  1. Destruktoren werden automatisch aufgerufen und können nicht explizit aufgerufen werden.
  2. Destruktoren können nicht überladen werden. Somit kann eine Klasse höchstens einen Destruktor haben.
  3. Destruktoren werden nicht vererbt. Daher hat eine Klasse keine anderen Destruktoren als den, der in ihr deklariert werden kann.
  4. 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.
  5. Die Ausführung des Destruktors für die Instanz kann jederzeit erfolgen, nachdem die Instanz zur Zerstörung berechtigt ist.
  6. Wenn eine Instanz zerstört wird, werden die Destruktoren in ihrer Vererbungskette in der Reihenfolge von den meisten abgeleiteten zu den wenigsten abgeleiteten aufgerufen.

Finalisieren

In C # führt die Finalize-Methode die Operationen aus, die ein Standard-C++ - Destruktor ausführen würde. In C # wird es nicht als Finalize bezeichnet. Sie verwenden die C++ - Destruktorsyntax, bei der ein Tildesymbol (~) vor dem Namen der Klasse platziert wird.

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 - Schnittstelle teilt der Welt mit, dass Ihre Klasse an Ressourcen festhält, die entsorgt werden müssen, und bietet Benutzern eine Möglichkeit, diese freizugeben. Wenn Sie in Ihrer Klasse einen Finalizer implementieren müssen, sollte Ihre Dispose-Methode die GC.SuppressFinalize() -Methode verwenden , um die Finalisierung Ihrer zu gewährleisten Instanz wird unterdrückt.

Was zu benutzen?

Es ist nicht legal, einen Destruktor explizit aufzurufen. Dein Destruktor wird vom Garbage Collector gerufen. Wenn Sie mit wertvollen nicht verwalteten Ressourcen (z. B. Dateihandles) arbeiten, die Sie so schnell wie möglich schließen und entsorgen möchten, müssen Sie die IDisposable-Schnittstelle implementieren.

190

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

  • Sie haben direkten Zugriff auf eine nicht verwaltete Ressource (z. B. über ein IntPtr), und Sie können SafeHandle nicht verwenden, wodurch es einfacher wird
  • Sie implementieren IDisposable in einer Klasse, die nicht versiegelt ist. (Ich bevorzuge es, Klassen zu versiegeln, sofern sie nicht für die Vererbung vorgesehen sind.) In solchen Fällen ist ein Finalizer Teil des kanonischen Dispose-Musters.
43
Jon Skeet

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

8
torial

Genau wie C++ ist es der Destruktor. In C # wird es jedoch nicht explizit aufgerufen, wenn das Objekt erfasst wird.

4

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 festgelegt wird.

3
Jeff Stong

~ steht normalerweise für einen Dekonstruktor. die ausgeführt wird, bevor ein Objekt stirbt.

Hier ist eine Beschreibung der C # -Dekonstruktoren, die ich gefunden habe

1
stephenbayer