Dieser Artikel wurde maschinell übersetzt. Wenn Sie die englische Version des Artikels anzeigen möchten, aktivieren Sie das Kontrollkästchen Englisch. Sie können den englischen Text auch in einem Popupfenster anzeigen, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch

Object.Finalize-Methode: ()

 

Veröffentlicht: Oktober 2016

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)

abstract Finalize : unit -> unit
override Finalize : unit -> unit

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

In diesem Abschnitt

Die Object Klasse enthält keine Implementierung für die Finalize -Methode und der Garbage Collector nicht von abgeleitete Typen markieren Object auf einen Abschluss warten, wenn sie außer Kraft setzen die Finalize Methode.

Wenn ein Typ überschreibt die Finalize -Methode der Garbage Collector wird ein Eintrag für jede Instanz des Typs in eine interne Struktur, die die Warteschlange der Abschluss aufgerufen. Die Abschluss Warteschlange enthält Einträge für alle Objekte im verwalteten Heap, dessen Abschluss Code ausgeführt werden muss, bevor der Garbage Collector den Arbeitsspeicher freigeben kann. Anschließend ruft der Garbage Collector die Finalize Methode automatisch in den folgenden Situationen:

  • Nachdem der Garbage Collector ermittelt hat, dass ein Objekt kann nicht zugegriffen werden, es sei denn, das Objekt von der Finalisierung durch einen Aufruf von ausgenommen wurde die GC.SuppressFinalize Methode.

  • Während des Herunterfahrens einer Anwendungsdomäne es sei denn, das Objekt aus seiner Finalisierung verfolgt ausgenommen ist. Während des Herunterfahrens können sogar Objekte, die immer noch zugänglich sind abgeschlossen.

Finalizewird automatisch aufgerufen nur einmal auf eine bestimmte Instanz, es sei denn, das Objekt erneut registriert wird, wie z. B. mit einem Mechanismus GC.ReRegisterForFinalize und die GC.SuppressFinalize Methode nicht anschließend aufgerufen wurde.

FinalizeVorgänge weisen die folgenden Einschränkungen:

  • Die genaue Uhrzeit, wann der Finalizer ausgeführt wird, ist nicht definiert. Um deterministische Freigabe von Ressourcen für Instanzen Ihrer Klasse implementiert sicherzustellen, dass eine Close Methode, oder geben Sie einen IDisposable.Dispose Implementierung.

  • Die Finalizer zweier Objekte ist nicht gewährleistet in einer bestimmten Reihenfolge ausgeführt, selbst wenn ein Objekt in die andere verweist. D. h. wenn Objekt A verfügt über einen Verweis auf das Objekt B, und beide Finalizer besitzen, Objekt B möglicherweise bereits beendet wurden beim Starten des Finalizers des Objekts ein.

  • Der Thread, auf dem der Finalizer ausgeführt wird, ist nicht angegeben.

Die Finalize Methode möglicherweise nicht bis zum Abschluss ausgeführt, oder unter den folgenden außergewöhnlichen Umständen möglicherweise nicht alle ausgeführt:

  • Wenn eine andere Finalizer auf unbestimmte Zeit blockiert (wechselt in eine Endlosschleife versucht, eine Sperre kann es nie zu erhalten und so weiter). Da die Runtime versucht, Finalizer bis zum Abschluss ausgeführt, möglicherweise andere Finalizer nicht wenn ein Finalizer blockiert unbegrenzt aufgerufen werden.

  • Wenn der Prozess beendet, ohne dadurch die Möglichkeit zum Bereinigen von der Laufzeitmoduls. In diesem Fall wird die Laufzeit die erste Benachrichtigung für Beendigung des Prozesses eine DLL_PROCESS_DETACH-Benachrichtigung.

Die Common Language Runtime weiterhin Threadobjekte während des Herunterfahrens nur, während die Anzahl der finalisierbare Objekte weiterhin verringern.

Wenn Finalize oder eine Überschreibung der Finalize löst eine Ausnahme aus, und die Common Language Runtime nicht von einer Anwendung, die die Standardrichtlinie überschreibt gehostet wird, die Runtime beendet den Prozess und keine aktiven try/finally Blöcke oder Finalizer ausgeführt werden. Dieses Verhalten wird Prozessintegrität sichergestellt, wenn der Finalizer nicht freigeben oder Löschen von Ressourcen.

Sie sollten überschreiben Finalize für eine Klasse, die nicht verwaltete Ressourcen, wie z. B. verwendet Dateihandles oder Datenbankverbindungen, die freigegeben werden müssen, wenn das verwaltete Objekt, das sie verwendet, die während der Garbagecollection verworfen wird.

System_CAPS_importantWichtig

Wenn eine SafeHandle Objekt ist verfügbar, die nicht verwaltete Ressource einschließt, die empfohlene Alternative ist das Implementieren des Dispose-Musters mit einem sicheren Handle und nicht überschreiben Finalize. Weitere Informationen finden Sie unter die SafeHandle-Alternative Abschnitt.

Die Object.Finalize Methode hat keine Funktion in der Standardeinstellung, aber Sie sollten überschreiben Finalize nur, wenn erforderlich, und dies nur auf nicht verwaltete Ressourcen freizugeben. Freigeben von Arbeitsspeicher ist länger dauert, wenn ein Finalisierung-Vorgang ausgeführt wird, da er mindestens zwei Garbage Collections erforderlich ist. Darüber hinaus sollten Sie überschreiben die Finalize Methode Referenzzwecken nur Typen. Die common Language Runtime finalisiert nur Verweistypen. Finalizer für Werttypen werden ignoriert.

Jede Implementierung von Finalize müssen in einem abgeleiteten Typ seinem Basistyp Implementierung von Aufrufen Finalize. Dies ist der einzige Fall, in der Anwendung Code aufrufen darf Finalize.

System_CAPS_noteHinweis

Der C#-Compiler lässt nicht zu, Sie überschreiben die Finalize Methode. Stattdessen Sie einen Finalizer bereitstellen, durch die Implementierung einer Destruktor für die Klasse. Ein C#-Destruktor ruft automatisch den Destruktor ihrer Basisklasse.

Visual C++ bietet auch eine eigene Syntax für die Implementierung der Finalize Methode. Weitere Informationen finden Sie im Abschnitt "Destruktoren und Finalizer" Gewusst wie: definieren und Verarbeiten von Klassen und Strukturen (C++-CLI).

Da der Garbagecollection nicht deterministisch ist, wissen Sie nicht genau, wenn der Garbage Collector Finalisierung ausführt. Um Ressourcen freizugeben sofort Wunsch können Sie zum Implementieren der dispose-Muster und IDisposable Schnittstelle. Die IDisposable.Dispose Implementierung kann aufgerufen werden, durch den Consumer Ihrer Klasse das Freigeben von nicht verwalteten Ressourcen und können Sie die Finalize Methode, um nicht verwaltete Ressourcen freizugeben, wenn die Dispose Methode wird nicht aufgerufen.

Finalizedauert die nahezu jede Aktion, z. B. kann ein Objekt (die das Objekt wieder zugänglich gemacht werden,) zugänglich. nachdem sie während der Garbagecollection bereinigt wurden. Allerdings kann das Objekt nur einmal wieder zugänglich gemacht werden; Finalize kann nicht wieder zugänglich gemachte Objekte während der Garbagecollection aufgerufen werden. Es ist eine Aktion, die Ihre Implementierung von Finalize abwartet, nie: sollten sie nie eine Ausnahme auslösen.

Zuverlässige Finalizer ist oft schwierig, da Sie Annahmen über den Zustand der Anwendung vornehmen können, und wie z. B. Systemausnahmen nicht behandelt OutOfMemoryException und StackOverflowException den Finalizer zu beenden. Anstatt zu implementieren einen Finalizer für die Klasse, um nicht verwaltete Ressourcen freizugeben, können Sie ein Objekt, das von abgeleitet ist die System.Runtime.InteropServices.SafeHandle -Klasse Wrapper für die nicht verwalteten Ressourcen und anschließenden Implementieren des Dispose-Musters, ohne einen Finalizer. .NET Framework bietet die folgenden Klassen in der Microsoft.Win32 Namespace, die von der abgeleiteten System.Runtime.InteropServices.SafeHandle:

Im folgenden Beispiel wird die dispose-Muster mit SafeHandles anstelle von der Finalize Methode. Definiert eine FileAssociation Klasse, die Registrierungsinformationen zur Anwendung umschließt, die Dateien mit einer bestimmten Dateierweiterung behandelt. Die zwei Registrierungshandles zurückgegeben als out Parameter durch Windows RegOpenKeyEx an Funktionsaufrufe übergeben werden die SafeRegistryHandle Konstruktor. Der Typ der geschützte Dispose -Methode ruft dann die SafeRegistryHandle.Dispose Methode, um diese zwei Handles freizugeben.

Derzeit ist kein Code Beispiel verfügbar, oder die Sprache wird nicht unterstützt.

Im folgenden Beispiel wird überprüft, ob die Finalize Methode wird aufgerufen, wenn ein Objekt, das überschreibt Finalize zerstört wird. Beachten Sie, dass in einer produktionsanwendung die Finalize Methode würde überschrieben werden, um nicht verwaltete Ressourcen frei, die für das Objekt freizugeben. Beachten Sie, dass im C#-Beispiel einen Destruktor anstelle von bietet die Finalize Methode.

Derzeit ist kein Code Beispiel verfügbar, oder die Sprache wird nicht unterstützt.

For an additional example that overrides the M:System.Object.Finalize method, see the M:System.GC.SuppressFinalize(System.Object) method.

Universelle Windows-Plattform
Verfügbar seit 8
.NET Framework
Verfügbar seit 1.1
Portierbare Klassenbibliothek
Unterstützt in: portierbare .NET-Plattformen
Silverlight
Verfügbar seit 2.0
Windows Phone Silverlight
Verfügbar seit 7.0
Windows Phone
Verfügbar seit 8.1
Zurück zum Anfang
Anzeigen: