Wann sollte ich GC.SuppressFinalize () verwenden?
In .NET, unter welchen Umständen sollte ich GC.SuppressFinalize()
?
Welchen Vorteil(E) hat mit dieser Methode geben Sie mir?
InformationsquelleAutor der Frage |
Du musst angemeldet sein, um einen Kommentar abzugeben.
SuppressFinalize sollte nur aufgerufen werden, indem Sie eine Klasse, die einen finalizer hat. Es wird informiert der Garbage Collector (GC), die
this
Objekt wurde gereinigt, bis voll.Empfohlen IDisposable-pattern wenn Sie ein finalizer:
Normalerweise die CLR-etikettiert auf Objekte mit finalizer, wenn Sie erstellt sind (was Sie teurer zu erstellen). SuppressFinalize sagt der GC, dass das Objekt wurde ordnungsgemäß aufgeräumt und müssen nicht auf die finalizer-Warteschlange. Es sieht aus wie ein C++ - Destruktor, aber nicht handeln, etwas wie eine.
Die SuppressFinalize-Optimierung nicht trivial, da Ihre Objekte Leben können eine lange Zeit warten auf die finalizer-Warteschlange. Nicht versucht zu rufen SuppressFinalize auf andere Objekte wohlgemerkt. Das ist ein schwerwiegender Mangel warten, um zu geschehen.
Design-Richtlinien und informieren uns, dass ein finalizer ist nicht erforderlich, wenn Ihr Objekt IDisposable implementiert, aber wenn Sie einen finalizer sollten Sie die IDisposable implementieren, um zu erlauben, deterministische Bereinigung Ihrer Klasse.
Meisten der Zeit, die Sie sollten in der Lage sein, um Weg mit IDisposable-um die Ressourcen zu bereinigen. Sollten Sie nur finalizer, wenn Ihr Objekt hält auf nicht verwalteten Ressourcen und Sie müssen garantieren, dass diese Ressourcen bereinigt werden.
Hinweis: Manchmal Programmierer einen finalizer hinzufügen debug-builds des eigenen IDisposable-Klassen, um zu testen, ob der code hat entsorgt Ihr IDisposable-Objekt richtig.
InformationsquelleAutor der Antwort Robert Paulson
sagst du dem system, dass alles, was Arbeit würde getan haben in der finalizer ist bereits getan worden, so der finalizer nicht aufgerufen werden müssen. Aus der .NETTO-docs:
Im Allgemeinen, die meisten keine Dispose () - Methode sollte in der Lage sein zu rufen GC.SupressFinalize(), denn es sollte sauber alles, wäre cleand bis in die finalizer.
SupressFinalize ist nur etwas, das eine Optimierung ermöglicht es, das system an sich nicht die Mühe queing das Objekt der finalizer-thread. Ein richtig geschriebener Dispose()/finalizer sollte ordnungsgemäß funktionieren mit oder ohne einen Aufruf von GC.SupressFinalize().
InformationsquelleAutor der Antwort Michael Burr
Diese Methode muss aufgerufen werden, auf die Dispose-Methode von Objekten, implementiert die IDisposable, auf diese Weise die GC würde nicht sagen, der finalizer ein anderes mal, wenn someones ruft die Dispose-Methode.
Finden Sie unter: http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx
InformationsquelleAutor der Antwort albertein
Wenn Objekt hat finalizer .net stellen eine Referenz in der finalization queue
Da haben wir den Aufruf von Dispose(tur), klares Objekt, so brauchen wir nicht finalization queue um diesen job zu machen.
So rufen Sie GC.SuppressFinalize(this) entfernen-Verweis in der finalization queue.
InformationsquelleAutor der Antwort
Wenn eine Klasse, oder alles, was daraus abgeleitet, vielleicht halten Sie den letzten live-Referenz auf ein Objekt einen finalizer, dann entweder
GC.SuppressFinalize(this)
oderGC.KeepAlive(this)
aufgerufen werden soll das Objekt nach jeder operation, die möglicherweise negativ beeinflusst, finalizer, so dass die finalizer ausgeführt wird nicht bis nach der operation abgeschlossen ist.Die Kosten der
GC.KeepAlive()
undGC.SuppressFinalize(this)
sind im wesentlichen die gleichen in jeder Klasse, die nicht mit einem finalizer und Klassen, die haben Finalizer sollten in der Regel nennenGC.SuppressFinalize(this)
ist also die letztere Funktion als letzten Schritt derDispose()
ist nicht immer erforderlich, aber es wird nicht falsch sein.InformationsquelleAutor der Antwort