2010-09-05 9 views
13

Duplicar posible:
Finalize vs Dispose¿Cuál es la diferencia entre finalizar y eliminar en .net?

Hola,

Recientemente fue interrogado en una entrevista acerca de finalización y desechar. ¿Cuándo se usa cada uno de ellos y cómo se relaciona Garbage Collector con ellos? Amablemente comparte enlaces para ilustrar más sobre el tema.

Amablemente compartir ...

Gracias de antemano.

+0

¿No recibió la oferta de trabajo entonces? Está cubierto en cualquier libro sobre C# o el CLR. –

+0

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

Respuesta

17

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.

+1

Me gustaría agregar que los Finalizer deben usarse con cuidado. Cuando agrega un finalizador a sus objetos, hace que el tiempo de ejecución se mantenga sobre el objeto durante al menos dos ciclos de GC. Además, dentro del finalizador no está garantizado que ningún miembro de su objeto no haya sido reclamado. Por lo tanto, acceder a ellos puede dar lugar a excepciones de tiempo de ejecución. – taylorjonl

15
  1. Finalizar: undeterministic no determinista destructor/finalizer llamado automáticamente por el recolector de basura cuando no hay más referencias a este caso.
  2. Deshacer: llamado de manera determinista por el desarrollador en un objeto que implementa IDisposable para liberar recursos.
+1

Creo que "no determinista" es la palabra correcta aquí. –

+0

@Steven, mi inglés es muy pobre. Gracias por señalar esto. –

+0

Entonces, si el desarrollador implementa IDisposable, ¿finalizará el GC? – HotTester

Cuestiones relacionadas