utilizacion de nothing

02/10/2006 - 13:42 por Hugo Gsell | Informe spam
La pregunta viene por lo siguiente... soy programador de vb6.
En un principio allá por el vb4 nunca utilicé la clausula nothing
cuando debería "liberar" un objeto.
Luego, ya en vb6, siempre que creaba un objeto digamos por ej. para acceso a
base de datos hacía

dim dbs as database
dim rst as recordset
set dbs =opendatabase(mibase)
set rst=dbs.openrecordset("mitabla")
.

close rstç
close dbs
set rst=nothing
set dbs=nothing

Me di cuenta que haciendolo esto con "toda instanciacion que hacia", además
de que es mucho mas claro, mis aplicacioses se colgaban menos y por ello
eran mas estables.
Aunque en realidad se suponía que por ej. al salid de un procedimiento todas
las variables "se limpiaban"
Ahora en .net tenemos el recolector y otras yerbas asociadas...
la pregunta es: ¿es suficiente con esto? "que pienso segir haciendolo" es
decir, siempre establecer a nothing cuando no utilice mas un objeto... ¿o no
ademas habria que "forzar" una llamada al recolector... o alguna otra cosa?
Y si deberia hacerlo ¿Como se hace?
desde ya muchas gracias.

Hugo A. Gsell
 

Leer las respuestas

#1 floyd303
02/10/2006 - 15:27 | Informe spam
Hola!

En principio con esto bastaria. El recolector ya se preocupara por ti
de liberar el espacio ocupado en memoria.
De todas maneras, si ves que tu aplicacion se degrada porque el
recolector no esta liberando la memoria cuando la necesitas, puedes
llamar a la funcion GC.Collect() para forzar al recolector a liberar
memoria. Lo que pasa es que esta funion es bastante consumidora de
recursos, por lo que tienes que llamarla solo en ocasiones realmente
necesarias.
Por otro lado, es una buena practica, si un objeto tuyo abre recursos
externos (una BD o un fichero de texto, etc) y que debe dejar cerrados
cuando la vida de este objeto termina, el implementar la interfaz
IDisposable. De tal manera que atiende a un nuevo metodo llamado
Dispose en el que se deben cerrar y liberar todo acceso a dichos
recursos externos.
De esta manera cualquier parte de la aplicacion que utilice ese objeto
debera llamar al Dispose antes de establecer a Nothing ese objeto. No
solo le indicamos al GC que debe liberar la memoria por ese objeto
(como tu has dicho: con el Nothing), sino que antes, hemos liberado
todos los posibles recursos utilizados por ese objeto (con el Dispose).

Dim obj as MyObject

obj = New MyObject
...
...
obj.Dispose() ' Cerramos todos los recursos utilizados por obj
obj = Nothing ' Indicamos al GC que puede liberar la memoria del objeto


Espero que todo esto te ayude
Un saludo
Roberto M. Oliva


Hugo Gsell ha escrito:

La pregunta viene por lo siguiente... soy programador de vb6.
En un principio allá por el vb4 nunca utilicé la clausula nothing
cuando debería "liberar" un objeto.
Luego, ya en vb6, siempre que creaba un objeto digamos por ej. para acceso a
base de datos hacía

dim dbs as database
dim rst as recordset
set dbs =opendatabase(mibase)
set rst=dbs.openrecordset("mitabla")
.

close rstç
close dbs
set rst=nothing
set dbs=nothing

Me di cuenta que haciendolo esto con "toda instanciacion que hacia", además
de que es mucho mas claro, mis aplicacioses se colgaban menos y por ello
eran mas estables.
Aunque en realidad se suponía que por ej. al salid de un procedimiento todas
las variables "se limpiaban"
Ahora en .net tenemos el recolector y otras yerbas asociadas...
la pregunta es: ¿es suficiente con esto? "que pienso segir haciendolo" es
decir, siempre establecer a nothing cuando no utilice mas un objeto... ¿o no
ademas habria que "forzar" una llamada al recolector... o alguna otra cosa?
Y si deberia hacerlo ¿Como se hace?
desde ya muchas gracias.

Hugo A. Gsell

Preguntas similares