¿Se debería llamar a GC.SuppressFinalize en objetos que no tienen un finalizador?

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

  •  05-07-2019
  •  | 
  •  

Pregunta

Por alguna razón, FXCop parece pensar que debería estar llamando GC.SuppressFinalize in Dispose, independientemente de si tengo un finalizador o no.

¿Me estoy perdiendo algo? ¿Hay alguna razón para llamar a GC.SuppressFinalize en objetos que no tienen un finalizador definido?

¿Fue útil?

Solución

Siempre hay un finalizador en IL - System.Object.Finalize () existe en cada clase, por lo que si crea una clase personalizada, tiene un finalizador que desea suprimir. Dicho esto, no todos los objetos se colocan en la cola de finalización, por lo que técnicamente solo debería suprimir la finalización si implementa su propio finalizador.

Si está implementando IDisposable para envolver recursos no administrados, debe incluir un finalizador, y debe evitar que esto se ejecute, ya que en teoría ya está haciendo la limpieza cuando elimine se llama.

Otros consejos

No es necesario llamar a GC.SuppressFinalize (this) en Disose, a menos que:

  • Usted es la clase base que implementa los métodos virtuales de Disposición destinados a reemplazar (de nuevo, puede que no sea su responsabilidad incluso aquí, pero es posible que desee hacerlo en ese caso)
  • Usted mismo tiene un finalizador. Técnicamente, cada clase en .NET tiene un finalizador, pero si el único finalizador presente es el de Object , entonces no se considera que el objeto necesite finalización y no se incluya en la lista de finalización en GC

Diría que, asumiendo que no tiene ninguno de los casos anteriores, puede ignorar ese mensaje de forma segura.

Todos los objetos tienen un método finalizador, incluso si no ha implementado uno utilizando un destructor c # (que no está realmente garantizado que sea llamado por el GC). Es una buena práctica suprimir la llamada si ha implementado IDisposable porque eso significa que ha decidido realizar la finalización explícitamente.

artículo de devx

No veo la necesidad de llamar a SuppressFinalize () si no hay un finalizador definido. Si desea estar a la defensiva, entonces puede ser bueno tener un finalizador así como Dispose (), por lo que no necesita depender de los clientes para llamar siempre a Dispose (). Entonces no perderás recursos cuando se olviden.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top