GC.SuppressFinalize dovrebbe essere chiamato su oggetti che non hanno un finalizzatore?

StackOverflow https://stackoverflow.com/questions/621152

  •  05-07-2019
  •  | 
  •  

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?

È stato utile?

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.

articolo devx

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top