Finalizadores son ejecutados por la Recolección de basura antes de recuperar un objeto que es eligible for collection. Dispose()
está diseñado para limpiar recursos no administrados, como conexiones de red, archivos, identificadores del sistema operativo, & c. Funciona mejor en conjunto con el bloque using
, donde el compilador se asegurará de que se llame inmediatamente al Dispose()
una vez que haya terminado con un objeto, y también asegura que ya no podrá trabajar con el objeto una vez que haya sido eliminado.
Tenga en cuenta que finalizers don't have to run, por lo que dependa de dicha puede ser peligroso:
Lo que esto significa para usted: Sus programas no pueden confiar en los finalizadores mantener las cosas ordenadas. Los finalizadores son una red de seguridad, no un medio principal para la recuperación de recursos. Cuando haya terminado con un recurso, debe liberarlo llamando al Close
o Disconnect
o cualquier método de limpieza disponible en el objeto. (La interfaz IDisposable
codifica esta convención.)
Tenga cuidado también con el momento preciso en que un objeto es elegible para la recopilación. Lea el artículo vinculado anteriormente: no es ni ámbito (una palabra extraña que tiene que ver con el tiempo de vida de un objeto - es “the region of program text in which it is legal to refer to [a named entity] by its unqualified name.”) ni es estrictamente el recuento de referencias ya que un objeto puede ser elegible para la recopilación incluso antes de que la última referencia lejos.
¿No recibió la oferta de trabajo entonces? Está cubierto en cualquier libro sobre C# o el CLR. –
Respondí la pregunta, pero ¿qué me dejó perplejo cuando el entrevistador me preguntó qué sucede cuando implementamos explícitamente Dispose, cuál es el papel de GC y dónde queda Finalize? – HotTester