-
Destruktoren können nicht in Strukturen definiert werden. sie werden nur mit Klassen verwendet.
-
Eine Klasse darf nur einen Destruktor besitzen.
-
Destruktoren können nicht vererbt oder überladen werden.
-
Destruktoren können nicht aufgerufen werden. Der Aufruf wird automatisch vollzogen.
-
Ein Destruktor akzeptiert weder Modifizierer, noch besitzt er Parameter.
Im Folgenden sehen Sie beispielsweise die Deklaration eines Destruktors für die Car-Klasse:
class Car
{
~ Car() // destructor
{
// cleanup statements...
}
}
Der Destruktor ruft implizit Finalize für die Basisklasse des Objekts auf. Daher wird der vorangegangene Destruktorcode implizit folgendermaßen übersetzt:
protected override void Finalize()
{
try
{
// cleanup statements...
}
finally
{
base.Finalize();
}
}
Auf diese Weise wird die Finalize-Methode rücklaufend für alle Instanzen in der Vererbungskette aufgerufen, und zwar von der am meisten bis zu der am wenigsten abgeleiteten Instanz.
Hinweis |
|---|
| Leere Destruktoren sollten nicht verwendet werden. Wenn eine Klasse einen Destruktor enthält, wird ein Eintrag in der Finalize-Warteschlange erstellt. Wenn der Destruktor aufgerufen wird, wird der Garbage Collector aufgerufen, um die Warteschlange zu verarbeiten. Wenn der Destruktor leer ist, führt das zu einem unnötigen Leistungsverlust. |
Der Programmierer kann nicht steuern, wann der Destruktor aufgerufen wird, da dies durch den Garbage Collector bestimmt wird. Der Garbage Collector sucht nach Objekten, die von der Anwendung nicht mehr verwendet werden. Wenn er ein Objekt findet, das entfernt werden könnte, ruft er den Destruktor (wenn vorhanden) auf und beansprucht den durch das Objekt belegten Speicherplatz. Destruktoren werden darüber hinaus beim Beenden des Programms aufgerufen.
Es ist möglich, die Garbage Collection zu erzwingen, indem Collect aufgerufen wird. In den meisten Fällen sollte dies jedoch vermieden werden, da es hierdurch zu Leistungseinbußen kommen kann. Weitere Informationen finden Sie unter Erzwingen einer Garbage Collection.