Pregunta

GC es para los objetos administrados y Finalizar es para los objetos administrados eso es lo que he estado leyendo.Deseche está implícita y Finalizar es Explícito es lo que he estado leyendo.Puede alguien darme un ejemplo de un módulo en el que todas las tres cosas han sido utilizados por diferentes motivos?

¿Fue útil?

Solución

GC es la recolección de basura. Es la gestión de memoria automática, que los mangos de la limpieza de los objetos asignados en el montón administrado. El .NET GC emplea un algoritmo de marca y barrido. Cuando se produce una recolección de basura se considera básicamente todos los objetos en la parte de la pila que se desea limpiar como recuperables. Luego se pasa por un proceso de marcado donde se analiza en busca de raíces. Es decir. que identifica los objetos que todavía están en uso por la aplicación. Una vez hecho esto los objetos restantes son elegibles para la limpieza. El montón puede compactarse como parte de la limpieza.

Desechar y métodos Finalizer ambos ofrecen una opción para la limpieza de los recursos, que son no manejados por GC. P.ej. esto podría ser nativos mangos y similares. No tienen nada que ver con la recuperación de la memoria en el montón administrado.

Desechar se debe llamar explícitamente a un tipo que implementan IDisposable. Se le puede llamar o bien a través del método Dispose() sí mismo o a través de la construcción de using. La GC no llamará a botar automáticamente.

Un finalizador o destructor (como la especificación del lenguaje llama) por el contrario automáticamente se llama algún después de que el objeto era elegible para la limpieza. métodos Finalizar se ejecutan secuencialmente en un hilo dedicado.

Dispose() permite la limpieza determinista de los recursos, mientras que un finalizador puede actuar como una red de seguridad en caso de que el usuario no llama Dispose().

Si un tipo de implementos un finalizador, la limpieza de los casos se retrasa como el finalizador debe ser llamado antes de la limpieza. Es decir. se requerirá un cobro adicional para recuperar la memoria para las instancias del tipo. Si los utensilios de tipo IDisposable así, el método Dispose puede ser llamado y luego la instancia puede sustraerse a la finalización. Esto permitirá que el objeto a limpiar, como si no tuviera un finalizador.

Si desea profundizar en esto, recomiendo CLR a través de C # por Jeffrey Richter . Es un gran libro y cubre todos los detalles sangrientos de este (me fui a cabo una serie de detalles). El nuevo 3ª edición se acaba de publicar.

Otros consejos

Uno de los beneficios de .NET es el recolector de basura.En muchos idiomas, cada pieza de la memoria que debe ser manejado por el desarrollador cualquier memoria asignada, finalmente, deben ser liberados.En .NET (C#), el Recolector de Basura (GC) se hará cargo del proceso de liberación de memoria para usted.Se realiza un seguimiento del uso de sus objetos, y, después de convertirse en "sin raíces" (es decir:no hay referencias en su aplicación a ese objeto, directa o indirectamente), el objeto de la memoria se limpian automáticamente.

Disponer, o más particularmente, IDisposable y el Disponer de patrón, es utilizada para manejar los recursos por separado de la GC.Algunos de los recursos deben ser limpian de forma explícita, que , por distintas razones.Esto incluye el uso de un "nativo" de la API (donde .NETA no sabe acerca de la memoria asignada), utilizando un recurso que envuelve nativo de tiradores, etc.Con el fin de manejar este limpiamente, implementar IDisposable y el Disponer de patrón.

La finalización se produce en los objetos cuando están a punto de ser recogido por el recolector de basura.Esto proporciona una "red de seguridad", donde por un objeto que debería haber sido eliminados todavía puede ser limpiado, si un poco más tarde de lo ideal.Mediante la implementación de un finalizador, usted puede garantizar recursos no administrados, siempre son emitidos.

El problema con la mayoría de las muestras es que hay varias razones para el uso de IDisposable, y la correcta aplicación varía dependiendo de la razón por la que usted está utilizando.Por ejemplo, si ajusta un nativo de recursos de forma directa, se debe implementar un finalizador, pero si encapsular otro IDisposable tipo, un finalizador no es necesario, aunque aún debe implementar IDisposable.Para solucionar esto, he escrito acerca de IDisposable y finalización en profundidad en mi blog, que describe las múltiples razones por las que usted podría utilizar IDisposable, y patrones diferentes por diferentes razones.

Es posible que sólo quiera leer lo que considero el artículo definitivo sobre IDisposable, finalizadores y recolección de basura, Shawn Farkas' CLR Inside Out:. Excavando en IDisposable

Esto deja muy pocas dudas de artículos sobre el tema.

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