collector collection clean c# memory-management garbage-collection clr finalizer

collection - Buenas muestras del uso de Finalizer en C#



c# garbage collection (2)

Cuando leí algunos artículos sobre la administración de memoria en C #, me confundieron los métodos de Finalizer.

Hay tantas reglas complicadas que se relacionan con ellos. Por ejemplo, nadie sabe cuándo se llamará a los finalizadores, llamaron incluso si el código está en los lanzamientos de ctor, CLR no garantiza que se llamen a todos los finalizadores cuando cierren los programas, etc.

¿Para qué finalizadores se pueden usar en la vida real?

El único ejemplo que encontré fue el programa que emite un pitido cuando se inicia el GC.

¿Utiliza Finalizer en su código y puede tener algunas buenas muestras?

UPD:

Los finalizadores se pueden usar cuando los desarrolladores quieren asegurarse de que alguna clase siempre elimine correctamente a través de IDisposable. ( enlace ; gracias Steve Townsend )


Hay una discusión exhaustiva del uso de Finalizer, con ejemplos, aquí . Enlace cortesía de @SLaks en una respuesta relacionada.

Consulte también aquí para obtener un resumen más conciso de cuándo necesita uno (que es "no muy a menudo").

Hay una buena respuesta previa aquí con otro buen ejemplo del mundo real.

Para resumir con un extracto pertinente:

Los finalizadores son necesarios para garantizar la liberación de recursos escasos en el sistema operativo, como manejadores de archivos, sockets, objetos kernel, etc.

Para obtener ejemplos más correctos del mundo real, explore las clases afectadas en .Net Framework en esta búsqueda de MSDN:

http://social.msdn.microsoft.com/Search/en-US?query=%22.Finalize%22&ac=8

Una razón válida que puedo pensar cuando podría necesitar usar un finalizador es si ajusta una API de código nativo de terceros en un contenedor administrado, y la biblioteca subyacente de API de código nativo requiere la publicación oportuna de los recursos del sistema operativo usados.


La mejor práctica que conozco es sencilla: no los use. Sin embargo, podría haber algunos casos de esquina cuando desee utilizar un finalizador, particularmente cuando se trata de objetos no administrados y no puede implementar el patrón Dispose (no sé de problemas heredados) entonces puede implementar el método Finalize con precaución (y podría reducir el rendimiento de su sistema, haga que sus objetos no muertos y otros escenarios posiblemente extraños, teniendo en cuenta las excepciones ya que son inalcanzables :)).

En el 99% de los casos, simplemente escriba el patrón Dispose y use este método para limpiarlo y todo estará bien.