In Visual Studio, quando digito la linea "Implements IDisposable
", l'IDE aggiunge automaticamente:VB.NET - È necessario aggiungere un metodo Finalize durante l'implementazione di IDisposable?
- una variabile
disposedValue
membro - un
Sub Dispose() Implements IDisposable.Dispose
- un
Sub Dispose(ByVal disposing As Boolean)
Il Dispose()
dovrebbe essere lasciato da solo, e il codice di pulizia dovrebbe essere messo in Dispose(disposing)
.
Tuttavia, il Dispose Finalize Pattern indica che è necessario ignorare anche Sub Finalize()
per chiamare Dispose(False)
. Perché l'IDE non aggiunge anche questo? Devo aggiungerlo io stesso, o è in qualche modo chiamato implicitamente?
EDIT: Qualsiasi idea del perché l'IDE aggiunge automaticamente l'80% delle cose necessarie, ma lascia fuori il metodo Finalize? Non è il punto centrale di questo tipo di funzionalità che ti aiuta a
non dimenticare queste cose?
EDIT2: Grazie a tutti per le vostre risposte eccellenti, questo ora ha perfettamente senso!
L'implementazione di Dispose non significa che è necessario implementare anche un finalizzatore. È possibile liberare risorse non gestite in un metodo Dispose senza mai aver bisogno di un finalizzatore. Se è necessario implementare un finalizzatore, la logica di pulitura effettiva dovrebbe essere in una funzione separata che consente di disporre e finalizzare la chiamata. –
Questo è sbagliato.Se si fa affidamento esclusivamente su Dispose() per liberare risorse non gestite, la memoria si perde nei casi in cui Dispose non viene chiamato. Questo è esattamente ciò che il finalizzatore è lì per. – Laurent
Non sono sicuro del motivo per cui non ho risposto al commento di Scott prima - non l'ho notato, ma Laurent ha ragione - se il tuo Dispose sta pulendo le risorse non gestite, è necessario un Finalize per sicurezza. Non lasciarlo perché sei pigro. –