Finalizer (C#-Programmierhandbuch)Finalizers (C# Programming Guide)

Finalizer werden zur Zerstörung von Klasseninstanzen verwendet.Finalizers are used to destruct instances of classes.

HinweiseRemarks

  • Finalizer können nicht in Strukturen definiert werden.Finalizers cannot be defined in structs. Sie werden nur mit Klassen verwendet.They are only used with classes.

  • Eine Klasse kann nur über einen Finalizer verfügen.A class can only have one finalizer.

  • Finalizer können nicht vererbt oder überladen werden.Finalizers cannot be inherited or overloaded.

  • Finalizer können nicht aufgerufen werden.Finalizers cannot be called. Sie werden automatisch aufgerufen.They are invoked automatically.

  • Ein Finalizer kann nicht über Modifizierer oder Parameter verfügen.A finalizer does not take modifiers or have parameters.

Folgendes ist z.B. eine Deklaration eines Finalizers für die Klasse Car:For example, the following is a declaration of a finalizer for the Car class.

class Car
{
    ~Car()  // destructor
    {
        // cleanup statements...
    }
}

Ein Finalizer kann auch als Ausdruckstextdefinition implementiert werden, wie im folgenden Beispiel gezeigt.A finalizer can also be implemented as an expression body definition, as the following example shows.

using System;

public class Destroyer
{
   public override string ToString() => GetType().Name;
   
   ~Destroyer() => Console.WriteLine($"The {ToString()} destructor is executing.");
}

Der Finalizer ruft Finalize implizit auf der Basisklasse des Objekts auf.The finalizer implicitly calls Finalize on the base class of the object. Daher wird der Aufruf eines Finalizers implizit in den folgenden Code übersetzt:Therefore, a call to a finalizer is implicitly translated to the following code:

protected override void Finalize()  
{  
    try  
    {  
        // Cleanup statements...  
    }  
    finally  
    {  
        base.Finalize();  
    }  
}  

Dies bedeutet, dass die Finalize-Methode für alle Instanzen in der Vererbungskette rekursiv aufgerufen wird, von der am meisten bis zu der am wenigsten abgeleiteten.This means that the Finalize method is called recursively for all instances in the inheritance chain, from the most-derived to the least-derived.

Hinweis

Leere Finalizer sollten nicht verwendet werden.Empty finalizers should not be used. Wenn eine Klasse einen Finalizer enthält, wird ein Eintrag in der Finalize-Warteschlange erstellt.When a class contains a finalizer, an entry is created in the Finalize queue. Wenn der Finalizer aufgerufen wird, wird der Garbage Collector aufgerufen, um die Warteschlange zu verarbeiten.When the finalizer is called, the garbage collector is invoked to process the queue. Ein leerer Finalizer führt nur zu einem unnötigen Leistungsverlust.An empty finalizer just causes a needless loss of performance.

Der Programmierer hat keine Kontrolle darüber, wann der Finalizer aufgerufen wird, da dies durch den Garbage Collector bestimmt wird.The programmer has no control over when the finalizer is called because this is determined by the garbage collector. Der Garbage Collector sucht nach Objekten, die von der Anwendung nicht mehr verwendet werden.The garbage collector checks for objects that are no longer being used by the application. Wenn er ein Objekt als abschließbar angesehen wird, ruft er den Finalizer auf (sofern vorhanden) und fordert den Arbeitsspeicher, der zum Speichern des Objekts verwendet wurde, zurück.If it considers an object eligible for finalization, it calls the finalizer (if any) and reclaims the memory used to store the object. Finalizer werden auch aufgerufen, wenn das Programm beendet wird.Finalizers are also called when the program exits.

Es ist möglich, die Garbage Collection durch Aufrufen von Collect zu erzwingen, aber dies sollte meistens vermieden werden, da es Leistungsprobleme hervorrufen kann.It is possible to force garbage collection by calling Collect, but most of the time, this should be avoided because it may create performance issues.

Verwenden von Finalizern zum Freigeben von RessourcenUsing Finalizers to Release Resources

Im Allgemeinen erfordert C# nicht so viel Speicherverwaltung wie benötigt wird, wenn Sie mit einer anderen Sprache entwickeln, die nicht auf eine Laufzeit mit der Garbage Collection abzielt.In general, C# does not require as much memory management as is needed when you develop with a language that does not target a runtime with garbage collection. Der Garbage Collector von .NET Framework verwaltet implizit die Belegung und Freigabe von Arbeitsspeicher für Ihre Objekte.This is because the .NET Framework garbage collector implicitly manages the allocation and release of memory for your objects. Wenn Ihre Anwendung nicht verwaltete Ressourcen wie z.B. Fenster, Dateien und Netzwerkverbindungen kapselt, sollten Sie Finalizer verwenden, um die Ressourcen freizugeben.However, when your application encapsulates unmanaged resources such as windows, files, and network connections, you should use finalizers to free those resources. Wenn das Objekt abgeschlossen werden kann, führt der Garbage Collector die Finalize-Methode des Objekts aus.When the object is eligible for finalization, the garbage collector runs the Finalize method of the object.

Explizite Freigabe von RessourcenExplicit Release of Resources

Wenn Ihre Anwendung eine umfangreiche externe Ressource verwendet, wird außerdem empfohlen, dass Sie eine Möglichkeit bieten, die Ressource explizit freizugeben, bevor der Garbage Collector das Objekt freigibt.If your application is using an expensive external resource, we also recommend that you provide a way to explicitly release the resource before the garbage collector frees the object. Implementieren Sie dazu eine Dispose-Methode aus der Schnittstelle IDisposable, die die erforderliche Bereinigung für das Objekt durchführt.You do this by implementing a Dispose method from the IDisposable interface that performs the necessary cleanup for the object. Dies kann die Leistung der Anwendung erheblich verbessern.This can considerably improve the performance of the application. Trotz dieser expliziten Kontrolle über Ressourcen, wird der Finalizer Ressourcen sicher bereinigen, wenn der Aufruf der Dispose-Methode fehlschlägt.Even with this explicit control over resources, the finalizer becomes a safeguard to clean up resources if the call to the Dispose method failed.

Weitere Informationen zum Bereinigen von Ressourcen finden Sie unter den folgenden Themen:For more details about cleaning up resources, see the following topics:

BeispielExample

Das folgende Beispiel erstellt drei Klassen, die eine Vererbungskette bilden.The following example creates three classes that make a chain of inheritance. Die Klasse First ist die Basisklasse, Second wird von First abgeleitet, und Third wird von Second abgeleitet.The class First is the base class, Second is derived from First, and Third is derived from Second. Alle drei verfügen über Finalizer.All three have finalizers. In Main wird eine Instanz der am meisten abgeleiteten Klasse erstellt.In Main, an instance of the most-derived class is created. Wenn das Programm ausgeführt wird, beachten Sie, dass die Finalizer der drei Klassen automatisch und in Reihenfolge von der am meisten bis zu der am wenigsten abgeleiteten aufgerufen werden.When the program runs, notice that the finalizers for the three classes are called automatically, and in order, from the most-derived to the least-derived.

class First
{
    ~First()
    {
        System.Diagnostics.Trace.WriteLine("First's destructor is called.");
    }
}

class Second : First
{
    ~Second()
    {
        System.Diagnostics.Trace.WriteLine("Second's destructor is called.");
    }
}

class Third : Second
{
    ~Third()
    {
        System.Diagnostics.Trace.WriteLine("Third's destructor is called.");
    }
}

class TestDestructors
{
    static void Main()
    {
        Third t = new Third();
    }

}
/* Output (to VS Output Window):
    Third's destructor is called.
    Second's destructor is called.
    First's destructor is called.
*/

C#-ProgrammiersprachenspezifikationC# Language Specification

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.

Siehe auchSee Also

IDisposable
C#-ProgrammierhandbuchC# Programming Guide
KonstruktorenConstructors
Garbage CollectionGarbage Collection