VB.NET - Sollte eine Finalize-Methode Hinzugefügt werden, wenn der IDisposable implementiert?
In Visual Studio, wenn ich die Zeile "Implements IDisposable
", fügt die IDE automatisch:
- eine
disposedValue
member-variable - eine
Sub Dispose() Implements IDisposable.Dispose
- eine
Sub Dispose(ByVal disposing As Boolean)
Den Dispose()
allein gelassen werden sollte, und der clean-up-code, sollte in Dispose(disposing)
.
Jedoch die Entsorgen Sie Die Finalize-Muster sagt, man sollte auch überschreiben Sub Finalize()
zu nennen Dispose(False)
. Warum nicht die IDE auch? Muss ich hinzufügen, dass es mich, oder ist es irgendwie implizit genannt?
EDIT: eine Ahnung, warum die IDE fügt automatisch 80% der benötigten Sachen, aber lässt die Finalize-Methode? Ist das nicht der springende Punkt, der diese Art von Funktion zu helfen, Sie nicht vergessen, diese Dinge?
EDIT2: Danke Ihnen allen für Ihre hervorragenden Antworten, das macht jetzt Sinn!
InformationsquelleAutor Laurent | 2008-09-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie tatsächlich halten die nicht-verwalteten Ressourcen, die nicht automatisch bereinigt werden, indem der garbage collector und Reinigung diejenigen, die sich in Ihrer Dispose(), dann ja, Sie sollten das gleiche tun in der Finalize().
Wenn Sie der IDisposable implementiert, für einige andere Grund, die Implementierung von Finalize() ist nicht erforderlich.
Die grundlegende Frage ist diese: Wenn Sie Dispose() nicht aufgerufen und Ihr Objekt von der garbage Collection eingesammelt, würde Speicherverlust? Wenn ja, implementieren Sie Abzuschließen. Wenn Nein, brauchen Sie nicht zu. Vermeiden Sie auch implementieren von Finalize", nur weil es sicherer". Objekte mit benutzerdefinierten Finalizer kann potenziell müssen zwei GC geht, Sie zu befreien-einmal, um Sie auf die bevorstehende Finalizer-Warteschlange, und eine zweite pass zu tatsächlich freien Speicher.
Das ist falsch. Wenn Sie verlassen sich ausschließlich auf Dispose() auf nicht verwaltete Ressourcen frei, dann Speicher Leck in Fällen, in denen Dispose nicht aufgerufen wird. Das ist genau das, was der finalizer ist es für.
Nicht sicher, warum ich nicht resond Scotts Kommentar zuvor -- muss nicht bemerkt haben, aber Laurent ist richtig -- wenn Ihr Entsorgen, Aufräumen ist nicht verwaltete Ressourcen, ein Finalisieren ist notwendig für die Sicherheit. Überlassen Sie es nicht, weil du zu faul bist.
InformationsquelleAutor Jonathan Rupp
Nicht, Sie nicht brauchen, um Abzuschließen, es sei denn, Sie haben nicht verwaltete Ressourcen zu bereinigen.
In den meisten Fällen der Grund für eine Klasse ist ein Einwegartikel ist, da hält es Verweise zu anderen managed IDisposable-Objekten. In diesem Fall werden keine Finalize-Methode erforderlich oder wünschenswert ist.
Sie können, aber wenn Dispose nicht aufgerufen wird, dann werden Sie wohl ein Speicherleck, ohne eine Finalize-Methode als gut.
InformationsquelleAutor Matt Howells
InformationsquelleAutor missa
Wie schon andere gesagt haben, Sie brauchen nicht einen finalizer implementieren, es sei denn, Sie sind direkt holding verwaltete Ressourcen. Auch, wenn Sie arbeiten .NET 2.0 oder höher, ist es unwahrscheinlich, dass Sie jemals brauchen werden, um einen finalizer implementieren, da normalerweise die SafeHandle verwendet werden können, um wickeln Sie Ihre nicht verwalteten Ressourcen.
Schrieb ich eine ziemlich langen blog-post deckt den hintergrund und die Implementierung der IDisposable-und Finalizer eine Weile zurück, die möglicherweise Wert, gelesen zu werden, wenn Sie nicht ganz klar darüber.
Nun ja, das ist der springende Punkt, der die IDisposable-pattern. Allerdings, wenn die Menschen vergessen zu nennen Entsorgen, dann der finalizer ist ein Schutzmechanismus, der Sie reinigt bis schließlich, die vergessen werden kann nicht, etwa, weil es von der Laufzeit aufgerufen.
InformationsquelleAutor Greg Beech