sobre la destrucción de formularios

09/12/2005 - 10:27 por luis | Informe spam
La teoría dice que un objeto se destruye cuando ya no hay más referencias al
mismo. Pero si yo en un método escribo esto:

Form2 x=new Form2();
x.Show();

Al acabar el método x deja de existir como variable local que es pero el
formulario sigue vivito y coleando. Entonces ¿cuál es la referencia a ese
formulario que lo mantiene "vivo"?

Entonces ¿cuando se destruye el formulario (me refiero a que esté disponible
para el recolector)? ¿Cuando no tengamos ninguna referencia y lo cerremos?
¿Se puede forzar su destrucción real (liberación de la memoria que ocupa)?

Preguntas similare

Leer las respuestas

#1 A.Poblacion
09/12/2005 - 10:37 | Informe spam
"luis" wrote in message
news:%23AFkiLK$
La teoría dice que un objeto se destruye cuando ya no hay más referencias


al
mismo. Pero si yo en un método escribo esto:

Form2 x=new Form2();
x.Show();

Al acabar el método x deja de existir como variable local que es pero el
formulario sigue vivito y coleando. Entonces ¿cuál es la referencia a ese
formulario que lo mantiene "vivo"?



La referencia la mantiene el Framework. Cuando creas un formulario de
System.Windows.Forms, las librerías de clases del Framework gestionan
internamente la bomba de mensajes de Windows, y van pasando los mensajes que
correspondan al formulario para que los procese. Eso implica que por dentro
necesita mantener una referencia al formulario, la cual lo mantiene "vivo".

Entonces ¿cuando se destruye el formulario (me refiero a que esté


disponible
para el recolector)? ¿Cuando no tengamos ninguna referencia y lo cerremos?
¿Se puede forzar su destrucción real (liberación de la memoria que ocupa)?



Si quieres forzar la destrucción, llama a x.Dispose(); Esto libera todos
los recursos consumidos por el formulario, y queda disponible para que lo
libere el Garbage Collector en cuanto destruyas la variable x. Puedes forzar
una pasada del Garbage Collector con la orden GC.Collect(), aunque Microsoft
recomienda que se utilice únicamente en tiempo de desarrollo para hacer las
pruebas de liberación de memoria, pero que en producción no se fuerce nunca
el Collect y se deje al sistema que lo lance internamente cuando lo
requiera.
Respuesta Responder a este mensaje
#2 Benton
09/12/2005 - 16:42 | Informe spam
Entonces ¿cuando se destruye el formulario (me refiero a que esté


disponible
para el recolector)? ¿Cuando no tengamos ninguna referencia y lo
cerremos?
¿Se puede forzar su destrucción real (liberación de la memoria que
ocupa)?



Si quieres forzar la destrucción, llama a x.Dispose(); Esto libera
todos
los recursos consumidos por el formulario, y queda disponible para que lo
libere el Garbage Collector en cuanto destruyas la variable x.



Después de llamar a Dispose(), ¿cómo destruyes una variable?

Saludos,

-Benton
Respuesta Responder a este mensaje
#3 A.Poblacion
09/12/2005 - 17:34 | Informe spam
"Benton" wrote in message
news:e4$spcN$
Después de llamar a Dispose(), ¿cómo destruyes una variable?



Bien, quizá no fue muy acertado el término "destruir" que utilicé. Lo
que quería decir es "hacer que la variable ya no sea una referencia al
objeto al que anteriormente se refería". La forma de conseguirlo es
asignarle un null, o si es una variable local, símplemente dejar que termine
la subrutina en la que estaba definida la variable.
Respuesta Responder a este mensaje
#4 luis
12/12/2005 - 09:40 | Informe spam
Gracias

"A.Poblacion" escribió en
el mensaje news:eR$4tQK$
"luis" wrote in message
news:%23AFkiLK$
La teoría dice que un objeto se destruye cuando ya no hay más referencias


al
mismo. Pero si yo en un método escribo esto:

Form2 x=new Form2();
x.Show();

Al acabar el método x deja de existir como variable local que es pero el
formulario sigue vivito y coleando. Entonces ¿cuál es la referencia a ese
formulario que lo mantiene "vivo"?



La referencia la mantiene el Framework. Cuando creas un formulario de
System.Windows.Forms, las librerías de clases del Framework gestionan
internamente la bomba de mensajes de Windows, y van pasando los mensajes
que
correspondan al formulario para que los procese. Eso implica que por
dentro
necesita mantener una referencia al formulario, la cual lo mantiene
"vivo".

Entonces ¿cuando se destruye el formulario (me refiero a que esté


disponible
para el recolector)? ¿Cuando no tengamos ninguna referencia y lo
cerremos?
¿Se puede forzar su destrucción real (liberación de la memoria que
ocupa)?



Si quieres forzar la destrucción, llama a x.Dispose(); Esto libera
todos
los recursos consumidos por el formulario, y queda disponible para que lo
libere el Garbage Collector en cuanto destruyas la variable x. Puedes
forzar
una pasada del Garbage Collector con la orden GC.Collect(), aunque
Microsoft
recomienda que se utilice únicamente en tiempo de desarrollo para hacer
las
pruebas de liberación de memoria, pero que en producción no se fuerce
nunca
el Collect y se deje al sistema que lo lance internamente cuando lo
requiera.





email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida