¿Se debería llamar a GC.SuppressFinalize en objetos que no tienen un finalizador?
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?
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.
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.