Markieren Sie das Kontrollkästchen Englisch, um die englische Version dieses Artikels anzuzeigen. Sie können den englischen Text auch in einem Popup-Fenster einblenden, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch
Diese Dokumentation wurde archiviert und wird nicht länger gepflegt.

Object.Finalize-Methode

Gibt einem Objekt Gelegenheit, Ressourcen freizugeben und andere Bereinigungen durchzuführen, bevor es von der Garbage Collection freigegeben wird.

Namespace:  System
Assembly:  mscorlib (in mscorlib.dll)

protected virtual void Finalize()

Die Finalize-Methode wird verwendet, um Bereinigungsvorgänge für nicht verwaltete Ressourcen auszuführen, die durch das aktuelle Objekt gehalten werden, bevor das aktuelle Objekt zerstört wird. Die Methode ist geschützt und kann daher nur über diese oder eine abgeleite Klasse aufgerufen werden.

Diese Methode wird automatisch aufgerufen, wenn auf das Objekt kein Zugriff mehr möglich ist, es sei denn, es wurde durch einen Aufruf von GC.SuppressFinalize von der Finalisierung ausgenommen. Während des Herunterfahrens einer Anwendungsdomäne wird Finalize automatisch für Objekte aufgerufen, die nicht von der Finalisierung ausgeschlossen sind, auch für jene, auf die noch zugegriffen werden kann. Finalize wird nur einmal automatisch für eine angegebene Instanz aufgerufen, außer wenn das Objekt mit einem Mechanismus, z. B. GC.ReRegisterForFinalize, erneut registriert wird, und GC.SuppressFinalize anschließend nicht aufgerufen wurde.

Jede Implementierung von Finalize in einem abgeleiteten Typ muss die Finalize-Implementierung des Basistyps aufrufen. Dies ist der einzige Fall, in dem Anwendungscode Finalize aufrufen darf.

HinweisHinweis

Da Sie die Finalize-Methode nicht direkt mit dem C#-Compiler implementieren können, ruft ein C#-Destruktor den Destruktor von seiner Basisklasse automatisch auf.

Die Durchführung von Finalize unterliegt folgenden Einschränkungen:

  • Der genaue Zeitpunkt, zu dem der Finalizer während der Garbage Collection ausgeführt wird, ist undefiniert. Es ist nicht garantiert, dass Ressourcen zu einem bestimmten Zeitpunkt freigegeben werden, es sei denn, es wird eine Close-Methode oder eine Dispose-Methode aufgerufen.

  • Es ist nicht gewährleistet, dass die Finalizer zweier Objekte in einer bestimmten Reihenfolge ausgeführt werden, selbst dann nicht, wenn eines der Objekte auf das andere verweist. Wenn Objekt A einen Verweis auf Objekt B enthält und beide Finalizer besitzen, könnte Objekt B daher bereits finalisiert worden sein, wenn der Finalizer von Objekt A aufgerufen wird.

  • Der Thread, in dem der Finalizer aufgerufen wird, ist unbestimmt.

Die Finalize-Methode wird unter den folgenden außergewöhnlichen Umständen möglicherweise nicht vollständig oder überhaupt nicht ausgeführt:

  • Ein anderer Finalizer ist auf unbestimmte Zeit blockiert (er befindet sich in einer Endlosschleife oder versucht, eine Sperre zur erhalten, deren Erhalt ihm nicht gewährt werden wird usw.). Da die Laufzeit versucht, Finalizer bis zum Ende auszuführen, werden andere Finalizer möglicherweise nicht ausgeführt, wenn ein Finalizer auf unbestimmte Zeit blockiert ist.

  • Der Prozess wird beendet, ohne dass die Laufzeit die Möglichkeit hatte, eine Bereinigung durchzuführen. In diesem Falle ist die erste Benachrichtigung der Laufzeit über die Beendigung des Prozesses eine DLL_PROCESS_DETACH-Benachrichtigung.

Die Laufzeit setzt das Ausführen von Finalize für Objekte während des Herunterfahrens nur so lange fort, wie die Anzahl der finalisierbaren Objekte sinkt.

Wenn Finalize oder eine Überschreibung von Finalize eine Ausnahme auslöst, und die Laufzeit nicht von einer Anwendung gehostet wird, die die Standardrichtlinie überschreibt, beendet die Laufzeit den Prozess, und es werden keine aktiven try-finally-Blöcke oder Finalizer ausgeführt. So wird Prozessintegrität sichergestellt, wenn der Finalizer Ressourcen nicht freigeben oder zerstören kann.

Hinweise zur Implementierung

Object.Finalize hat in der Standardeinstellung keine Wirkung. Nur wenn nötig, darf dies durch eine abgeleitete Klasse überschrieben werden, da das Freigeben während der Garbage Collection i. d. R. länger dauert, wenn ein Finalize-Vorgang durchgeführt werden muss.

Wenn ein Object Verweise auf Ressourcen enthält, muss Finalize von einer abgeleiteten Klasse überschrieben werden, damit diese Ressourcen freigegeben werden, bevor das Object während der Garbage Collection verworfen wird.

Ein Typ muss Finalize implementieren, wenn er nicht verwaltete Ressourcen wie Dateihandles oder Datenbankverbindungen verwendet, die ebenfalls freigegeben werden müssen, wenn das verwaltete Objekt, das sie verwendet, freigegeben wird. Zusätzliche und besser steuerbare Möglichkeiten der Ressourcenfreigabe finden Sie unter der IDisposable-Schnittstelle.

Finalize kann beliebige Aktionen durchführen, z. B. kann ein Objekt wieder zugänglich gemacht werden, nachdem es während der Garbage Collection bereinigt wurde. Ein Objekt kann allerdings nur einmal wieder zugänglich gemacht werden. Finalize kann während der Garbage Collection nicht für wieder zugänglich gemachte Objekte aufgerufen werden.

Destruktoren stellen das C#-Verfahren zur Durchführung von Bereinigungsaktionen dar. Destruktoren enthalten entsprechende Sicherheitsmaßnahmen, z. B. wird der Destruktor des Basistyps automatisch aufgerufen. In C# kann Object.Finalize weder aufgerufen noch überschrieben werden.

Das folgende Beispiel überprüft, ob die Finalize-Methode aufgerufen wird, wenn ein Objekt, das Finalize überschreibt, zerstört wird. Beachten Sie, dass in einer Produktionsanwendung die Finalize-Methode überschrieben werden würde, um nicht verwaltete vom Objekt belegte Ressourcen freizugeben. Beachten Sie außerdem, dass im C#-Beispiel ein Destruktor bereitgestellt wird, statt die Finalize-Methode zu überschreiben.


using System;
using System.Diagnostics;

public class ExampleClass
{
   Stopwatch sw;

   public ExampleClass()
   {
      sw = Stopwatch.StartNew();
      Console.WriteLine("Instantiated object");
   } 

   public void ShowDuration()
   {
      Console.WriteLine("This instance of {0} has been in existence for {1}",
                        this, sw.Elapsed);
   }

   ~ExampleClass()
   {
      Console.WriteLine("Finalizing object");
      sw.Stop();
      Console.WriteLine("This instance of {0} has been in existence for {1}",
                        this, sw.Elapsed);
   }
}

public class Demo
{
   public static void Main()
   {
      ExampleClass ex = new ExampleClass();
      ex.ShowDuration();
   }
}
// The example displays output like the following:
//    Instantiated object
//    This instance of ExampleClass has been in existence for 00:00:00.0011060
//    Finalizing object
//    This instance of ExampleClass has been in existence for 00:00:00.0036294


.NET Framework

Unterstützt in: 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Unterstützt in: 4, 3.5 SP1

Unterstützt in:

Windows 7, Windows Vista SP1 oder höher, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (Server Core wird nicht unterstützt), Windows Server 2008 R2 (Server Core wird mit SP1 oder höher unterstützt), Windows Server 2003 SP2

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen für .NET Framework.

Datum

Versionsgeschichte

Grund

Dezember 2010

Anmerkung, dass C#-Destruktoren die Finalize-Methode der Basisklasse aufrufen; außerdem wurde ein Beispiel hinzugefügt.

Kundenfeedback.

Anzeigen: