Descarga de objetos

02/03/2006 - 10:06 por AOG | Informe spam
Hola, voy a formular una pregunta, posiblemente sea tonta, cuando un
procedimento o metodo e instancio una clase en un objeto y este objeto se
encarga de abrir una conexion y ejecutar una consulta SQL entre otras cosas,
cuando termina dicho procedimiento o método el objeto se descarga de memoria
¿no?, es aconsejable de descargar el objeto antes de que termine el metodo
MiObjeto = nothing o MiObjeto.Dispose es que por ahorrar líneas hago esto:

1º Acción
Public Function ObtenerCliente(Byval Codigo as String) as DataSet
Dim oMiFuenteDatos as New GestionData
Return oMiFuenteDatos.ObtenerDataSet("Clientes", "Cod = '" + Codigo +
"'")
End Function

¿Seria mejor hacer esto o es igual? :
2º Acción
Public Function ObtenerCliente(Byval Codigo as String) as DataSet
Dim oMiFuenteDatos as New GestionData
Dim dtCli as DataSet
dtCli = oMiFuenteDatos.ObtenerDataSet("Clientes", "Cod = '" + Codigo +
"'")
oMiFuenteDatos.Dispose
oMiFuenteDatos = Nothing
Return dtCli
End Function

Esta es la clase GestionData que incluyo un Dispose para cerrar y descargar
la conexion
Public Class GestionData
Private mConexion As System.Data.IDbConnection
Public Sub New
AbrirConexion
End Sub
Private Sub AbrirConexion
'// Codificar Abrir conexion
End Sub

Public Funciton ObtenerDataSet(Byval NombreTabla as String, Byval
Condicion as string) as DataSet
'// Codificar Devolver DataSet
End Function

Public Sub Dispose
mConexion.Close
mConexion.Dispose
End Sub
End Class

Mi pregunta es en la primera Acción ¿Se ejecutaría el Dispose implementado
en la Clase GestionData?
En el caso que es correcto no hace falta hacer esto oMiFuenteDatos.Dispose
oMiFuenteDatos = Nothing en la segunda Acción, ¿no?

Bueno yo lo que suelo hace es la primero Accion pues creo que si se ejecuta
Dispose cuando el recolector de basura descarga el objeto oMiFuenteDatos que
ha instanciodo dicha clase. Con esto me ahorro líneas y es más limpio.
¿Qué opinais?

Un Saludo

Preguntas similare

Leer las respuestas

#1 Eduardo A. Morcillo [MS MVP VB]
02/03/2006 - 15:24 | Informe spam
El MiObjeto = Nothing puedes no ponerlo ya que de todas formas al salir de
su ambito la variable eliminara (ojo, la variable no el objeto que ella
contiene) lo que equivale a colocarle Nothing. Pero el Dispose si es algo
que conviene llamarlo siempre ya que libera los recursos en el momento en
lugar de esperar a que lo haga al destruirse el objeto, algo que no sabes
cuando es que va a pasar. La forma en que deberias hacer esa llamada es
dentro del bloque finally de un try, con lo cual te aseguras que se llame
aunque ocurra una excepcion:

Public Function ObtenerCliente(Byval Codigo as String) as DataSet

Dim oMiFuenteDatos as New GestionData

Try

Return oMiFuenteDatos.ObtenerDataSet("Clientes", "Cod = '" + Codigo
+ "'")

Finally

oMiFuenteDatos.Dispose()

End Try

End Function

Public Class GestionData
Private mConexion As System.Data.IDbConnection
Public Sub New
AbrirConexion
End Sub
Private Sub AbrirConexion
'// Codificar Abrir conexion
End Sub

Public Funciton ObtenerDataSet(Byval NombreTabla as String, Byval
Condicion as string) as DataSet
'// Codificar Devolver DataSet
End Function

Public Sub Dispose
mConexion.Close
mConexion.Dispose
End Sub
End Class



No se si sera por simplificacion del codigo que has puesto, pero Dispose
deberias implementarlo con la interface IDisposable.

Mi pregunta es en la primera Acción ¿Se ejecutaría el Dispose
implementado en la Clase GestionData?



No. Tampoco lo haria en el momento en que el recolector libere el objeto a
menos que tengas una llamada explicita a Dispose en el metodo Finalize. Te
recomiendo que busques sobre el Patron Dispose para que veas la mejor forma
de implementar el Dispose en las clases.

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
http://mvp.support.microsoft.com/pr...4EF5A4191C
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida