zumwalt tortugas modernos guerra destructores crucero clase buque acorazado .net garbage-collection destructor

.net - tortugas - diferencia entre destructor y recolector de basura



destructores c# (4)

El destructor es una función de miembro especial que se invoca cuando se destruye un objeto. Es el último método ejecutado por una clase.

El recolector de basura es parte del marco, administra automáticamente la memoria y recoge de manera no determinista objetos sin referencia para evitar fugas de memoria.

Quiero saber si hay alguna diferencia entre el destructor y el recolector de basura, el destructor se usa para deshacerse de todos los objetos no utilizados al final de la vida útil de la aplicación, igual es el uso del recolector de basura, el recolector de basura puede ser llamado o hecho manualmente al final de la aplicación, lo mismo con el destructor, ambos son opcionales y se usan para eliminar el objeto sin referencia, ¿alguien puede indicarme cuál es la diferencia exacta?


El recolector de basura forma parte del entorno .NET que realiza un seguimiento de los objetos y se asegura de que los objetos se eliminen de la memoria cuando ya no los necesiten.

Un destructor es parte de un diseño de clase. Es lo opuesto a un constructor. Cuando lo declaras, el GC lo llamará cuando destruya un objeto.

Aquí está la documentación de MSDN.


El recolector de basura y el finalizador / destructor están intrínsecamente vinculados; sin embargo, la mayoría de los objetos no necesitan (y no tienen) un destructor. En realidad, son muy raros en el código administrado, y generalmente se utilizan para garantizar que se liberen recursos no administrados. Si un objeto tiene un destructor / finalizador, el recolector de basura lo invoca al mismo tiempo que la recolección (tal vez en el próximo pase). La recolección de basura no es determinista, sucede cuando sucede, a menudo relacionada con la presión de la memoria.

Mucho más común, sin embargo, es IDisposable. Esto permite un patrón más predecible para liberar recursos ahora (en lugar de cuando sucede el GC siguiente). A menudo, las clases que tienen un finalizador también serán identificables, con la implementación de Dispose () deshabilitando el destructor (no es necesario si ya hemos limpiado). Tenga en cuenta que Dispose () no está relacionado con la recolección de elementos no utilizados, pero tiene soporte de idioma a través de la instrucción "using".

IDisposable es mucho más común que los finalizadores. Usted es responsable de asegurarse de que cualquier objeto IDisposable sea eliminado. Nota adicional: deshacerse de algo no hace que el objeto sea recolectado; eso lo hace solo el GC en cualquier horario que elija el CG. Eliminación, más bien, liberar recursos asociados . Como ejemplo, no querría que un archivo se bloquee abierta hasta que se produzca GC; el Dispose () aquí desbloquea el archivo (liberando el manejador del archivo OS).


El recolector de basura funciona principalmente copiando todos los objetos que puede encontrar en una nueva parte de la RAM y luego destruyendo el área anterior; ni sabe ni le importa si quedaron cinco o 500,000 objetos. Tenga en cuenta que además de encontrar todos los objetos a los que se hace referencia mediante referencias fuertes reales, el recolector de elementos no utilizados también puede encontrar otros objetos, incluidos los objetos que invalidan Finalize , los objetos utilizados como bloqueos de monitor, los objetos dirigidos por objetos WeakReference, etc. En el área antigua de la órbita, el recolector de basura debe ocuparse de cualquiera de los objetos "especiales" que conoce que aún podrían estar allí.

Entre otras cosas, el recolector de basura tiene una lista de todos los objetos que han registrado un finalizador; Verificará todos los objetos en esa lista para ver si todavía se han copiado a la nueva área de memoria. Si se encuentra alguno que no lo haya sido, se eliminarán de la lista de objetos con un finalizador registrado y se agregarán a una lista de objetos cuyo método Finalize se debe ejecutar tan pronto como sea posible. Una vez hecho esto para todos los objetos con un finalizador registrado, todos los objetos en la lista de objetos que necesiten finalización inmediata, así como cualquier objeto al que dichos objetos tengan una referencia, se copiarán en la nueva área.