GC.SuppressFinalize dovrebbe essere chiamato su oggetti che non hanno un finalizzatore?
Domanda
Per qualche ragione FXCop sembra pensare dovrei chiamare GC.SuppressFinalize in Dispose, indipendentemente dal fatto che io abbia o meno un finalizzatore.
Mi sto perdendo qualcosa? C'è un motivo per chiamare GC.SuppressFinalize su oggetti per i quali non è stato definito un finalizzatore?
Soluzione
Esiste sempre un finalizzatore in IL - System.Object.Finalize () esiste in ogni classe, quindi se crei una classe personalizzata, ha un finalizzatore che vuoi sopprimere. Detto questo, non tutti gli oggetti vengono inseriti nella coda di finalizzazione, quindi solo tecnicamente dovresti sopprimere la finalizzazione se implementi il ??tuo finalizzatore.
Se stai implementando IDisposable
per racchiudere risorse non gestite, dovresti includere un finalizzatore e dovresti impedirne l'esecuzione, poiché in teoria stai già facendo la pulizia quando Dispose
viene chiamato.
Altri suggerimenti
Non è necessario chiamare GC.SuppressFinalize (this)
in Dispose, a meno che:
- Sei la classe di base che implementa i metodi Dispose virtuali destinati a sovrascrivere (di nuovo, potrebbe non essere la tua responsabilità anche qui, ma potresti volerlo fare in quel caso)
- Hai un finalizzatore tu stesso. Tecnicamente, ogni classe in .NET ha un finalizzatore, ma se l'unico finalizzatore presente è quello in
Object
, l'oggetto non viene considerato come finalizzato e non viene inserito nell'elenco di finalizzazione su GC
Direi, supponendo che tu non abbia nessuno dei casi precedenti, che puoi tranquillamente ignorare quel messaggio.
Tutti gli oggetti hanno un metodo finalizzatore, anche se non ne è stato implementato uno usando un distruttore c # (che non è garantito che venga chiamato dal GC). È buona norma sopprimere la chiamata se hai implementato IDisposable perché ciò significa che hai deciso di eseguire esplicitamente la finalizzazione.
Non vedo alcun bisogno di chiamare SuppressFinalize () se non è stato definito un finalizzatore. Se vuoi essere difensivo, può essere utile avere un finalizzatore e Dispose (), quindi non è necessario fare affidamento sui client per chiamare sempre Dispose (). Quindi non perderai risorse quando dimenticano.