In Visual Studio, wenn ich die Zeile "Implements IDisposable
" eingeben, fügt die IDE automatisch:VB.NET - Sollte eine Finalize-Methode hinzugefügt werden, wenn IDisposable implementiert wird?
- ein
disposedValue
Membervariable - ein
Sub Dispose() Implements IDisposable.Dispose
- ein
Sub Dispose(ByVal disposing As Boolean)
Die Dispose()
sein sollte allein gelassen, und der Bereinigungscode sollte in Dispose(disposing)
gelegt werden.
Die Dispose Finalize Pattern besagt jedoch, dass Sie auch Sub Finalize()
überschreiben sollten, um Dispose(False)
zu rufen. Warum fügt die IDE das nicht hinzu? Muss ich es selbst hinzufügen oder wird es irgendwie implizit genannt?
EDIT: Eine Idee, warum die IDE automatisch 80% der erforderlichen Sachen hinzufügt, aber die Finalize-Methode auslässt? Ist nicht der ganze Sinn dieser Art von Feature, um Ihnen zu helfen
nicht diese Dinge vergessen?
EDIT2: Vielen Dank für Ihre ausgezeichnete Antworten, das macht jetzt Sinn!
Die Implementierung von Dispose bedeutet nicht, dass Sie auch einen Finalizer implementieren sollten. Sie können nicht verwaltete Ressourcen in einer Dispose-Methode freigeben, ohne jemals einen Finalizer zu benötigen. Wenn Sie einen Finalizer implementieren müssen, sollte sich Ihre tatsächliche Bereinigungslogik in einer separaten Funktion befinden, die den Aufruf sowohl verwerfen als auch abschließen kann. –
Das ist falsch.Wenn Sie sich ausschließlich auf Dispose() verlassen, um nicht verwaltete Ressourcen freizugeben, wird Speicher ausgelaufen, wenn Dispose nicht aufgerufen wird. Genau dafür ist der Finalizer da. – Laurent
Ich bin mir nicht sicher, warum ich nicht schon vor Scotts Kommentar residiert habe - ich hätte es nicht bemerkt, aber Laurent hat Recht - wenn Ihr Dispose unmanaged Ressourcen aufräumt, ist ein Finalize zur Sicherheit erforderlich. Lass es nicht aus, weil du faul bist. –