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

Preguntas similare

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
Respuesta Responder a este mensaje
#2 Jesús López
02/10/2006 - 22:20 | Informe spam
Establecer un objeto a Nothing, generamente no hace otra cosa que ponerlo a
disposición del recolector de basura. Es exáctamente el mismo resultado que
cuando la variable sale fuera del ámbito.

Sin embargo, cuando una clase implementa el interfaz IDisposable (que son
muchas) esto indica que o bien está usando recursos no gestionados o
recursos críticos que conviene liberar lo antes posible. En este caso lo más
recomendable es usar la nueva construcción Using introducida en VB 2005:


Using cn As DbConnection = CreateConnection()

' Usar la conexión con la base de datos

End Using

Este código es equivalente a :

Dim cn As DbConnection = CreateConnection()
Try
' usar la conexión
Finally
If Not cn Is Nothing then
cn.Dispose()
End If
End Try

Saludos:

Jesús López




"Hugo Gsell" escribió en el mensaje
news:
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


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