puede - diferencias entre el lenguaje de programación java y el lenguaje de programación c#
¿Cuáles son las diferencias fundamentales entre la recolección de basura en C#y Java? (3)
El consejo que te han dado es, en términos generales, una carga de hooey.
Tanto C # como Java tienen GC que intentan optimizar la recuperación rápida de muchos objetos pequeños. Están diseñados para resolver el mismo problema, lo hacen de maneras ligeramente diferentes, pero como usuario, las diferencias técnicas en su enfoque para utilizarlos son mínimas, incluso inexistentes para la mayoría de los usuarios.
IDisposable
no tiene nada que ver con el GC como tal. Es una forma estándar de nombrar métodos que de otro modo se llamarían close
, destroy
, dispose
, etc., y con frecuencia se llaman así en Java. Existe una propuesta para que Java 7 agregue algo muy similar a la palabra clave de using
que llamaría un método de close
similar.
"Destructores" en C # se refiere a finalizadores, esto se hizo deliberadamente para confundir a los programadores de C ++. :) La especificación CLR en sí los llama finalizadores, exactamente como lo hace la JVM.
Hay muchas maneras en que Java y C # / CLR difieren (tipos de valor de usuario, propiedades, genéricos y toda la familia de funciones relacionadas conocidas como Linq), pero el GC es un área donde puede desarrollar una cantidad sustancial de software antes de que necesite Preocuparse mucho por la diferencia entre ellos.
Recibí algunos consejos muy erróneos de un desarrollador / colega "senior" con respecto al recolector de basura de C #, como ...
"Necesitas usar destructores en todas partes en C # porque no se puede confiar en el recolector de basura".
"El recolector de basura C # no se puede pensar como el recolector de basura Java".
Esto me suena extremadamente sospechoso, por lo que sé, las diferencias entre los recolectores de basura de C # y Java son las siguientes ...
- C # es un recolector de basura generacional, Java es barrido de marca concurrente en 1.6, siendo G1 el nuevo recolector de basura predeterminado (generacional) con Java 7 y es opcional desde ~ 1.6.21. Por lo que sé
- C # como lenguaje tiene la capacidad de disponer manualmente los objetos que implementan
IDisposable
. Java siempre debe usar la recolección de basura, aunque algunos marcos como SWT requieren que llame manualmente a métodos para liberar memoria en el código nativo subyacente.
Me doy cuenta de que Java y C # son solo los lenguajes y los recolectores de basura son un componente del tiempo de ejecución, sin embargo, en este caso, estoy hablando específicamente de Sun / Oracle JVM y Microsoft .NET Runtime.
¿Alguien tiene comentarios?
Está al revés en los destructores. Necesitas no usar destructores en C # a menos que sea vital. Y si los usa, debería llamar a SuppressFinalize () si sabe que el objeto se encuentra en un estado en el que el código del destructor ya no es necesario (la mayoría de las veces porque la misma limpieza se realizó en una llamada a IDisposable.Dispose (). Si un objeto tiene un destructor y SuppressFinalize no se ha llamado, vivirá más tiempo (para que pueda tener ese destructor llamado).
El recolector de basura sin duda se puede confiar. No se puede confiar en llamar a un destructor, o hacerlo dentro de un cierto período de tiempo, pero no es una cuestión de que no sea confiable, es una cuestión de ser confiable en la recolección de basura, ¡es su trabajo!
No sé mucho sobre el recolector de basura de Java, y no tengo dudas de que tiene razón al decir que no se puede pensar como uno al otro cuando se trata de los detalles más finos, aunque espero que sea por el bien de los codificadores de Java en los que puede pensarse como .NET la mayor parte del tiempo, es decir, no pensar en ello, generalmente no es necesario.
Me temo que su compañero de trabajo es incorrecto, pero no confíe en mi palabra. Vamos a tener un link fest!
Aquí hay algunos buenos artículos sobre GC: http://msdn.microsoft.com/en-us/magazine/bb985010.aspx http://msdn.microsoft.com/en-us/magazine/bb985011.aspx
Además, el WebLog de Maoni tiene algunas cosas geniales (también lo actualizará, ya que los artículos anteriores son bastante antiguos): http://blogs.msdn.com/b/maoni/
Además, solo esta semana, Raymond Chen está haciendo una serie en GC: http://blogs.msdn.com/b/oldnewthing/archive/2010/08/13/10049634.aspx
Aquí hay una buena discusión sobre el uso de Dispose y finalización: http://www.bluebytesoftware.com/blog/2005/04/08/DGUpdateDisposeFinalizationAndResourceManagement.aspx