objeto collectio

07/08/2006 - 15:00 por Hugo Gsell | Informe spam
Tengo una clase MISDATOS... que en una función deve devolver algunos
"registros" con la estructura de mi clase misdatos.
Si hago...
dim kcollection as new collection
dim MiDato as MisDatos
LEOMISDATOS MiDato
kcollection.add MiDato 'pongo en el objeto collection el dato1
kcollection.add MiDato 'pongo en el objeto collection el dato2
aparentemente los agrega sin embargo al leer los datos de
kcollection.item(0)... y kcollection.item(1) solamente me muestra el último
dato supongo que la solución viene dada porque hay que hacerle un new a
cada nuevo elemento... como en vb6...

ejemplo tomado de http://msdn2.microsoft.com/en-us/li...45ab9.aspx

family.Add(New child(newName), newName)COMO LO SOLUCIONO EN .NET???Desde ya
muchas gracias.Hugo A. GsellSgo del EsteroArgentina
 

Leer las respuestas

#1 Leonardo Azpurua [mvp vb]
07/08/2006 - 17:12 | Informe spam
"Hugo Gsell" escribió en el mensaje
news:
Tengo una clase MISDATOS... que en una función deve devolver algunos
"registros" con la estructura de mi clase misdatos.
Si hago...
dim kcollection as new collection
dim MiDato as MisDatos
LEOMISDATOS MiDato
kcollection.add MiDato 'pongo en el objeto collection el dato1
kcollection.add MiDato 'pongo en el objeto collection el dato2
aparentemente los agrega sin embargo al leer los datos de
kcollection.item(0)... y kcollection.item(1) solamente me muestra el
último dato supongo que la solución viene dada porque hay que hacerle
un new a cada nuevo elemento... como en vb6...

ejemplo tomado de http://msdn2.microsoft.com/en-us/li...45ab9.aspx

family.Add(New child(newName), newName)COMO LO SOLUCIONO EN .NET???Desde
ya muchas gracias.Hugo A. GsellSgo del EsteroArgentina



Hola, Hugo:

Debes recordar que losobjetos son REFERENCIAS.

Cuando instancias MiDato (lo que no se ve en el codigo que posteas, pero
imagino que haras, porque de lo contrario obtendrias una excepcion de
referencia nula), creas UNA UNICA instancia de la clase. Cada vez que lo
agregas a la coleccion, simplemente estas agregando otra vez la misma
referencia. Y cuando le asignas valores, afectas a la unica instancia
guardada en la colección.

Tienes dos soluciones:

Una de ellas es agregar un metodo Clone a la clase MisDatos, que devuelva
una referencia a una instancia nueva con los mismos valores guardados en la
original, y escribir

laColeccion.Add miDato.Clone

los metodos "Clone" estuvieron de moda hace algunos años.

Otra es que la función que lee los datos te devuelva cada vez una instancia
nueva:

Do
miDato = LeerDato()
If Not miDato is Nothing Then
laColeccion.Add miDato
End If
Loop While Not miDato Is Nothing

donde LeerDato debe crear una nueva instancia del objeto y llenarla con la
info de la tabla.

Una estructura parecida (con la diferencia de que la creacion del objeto es
responsabilidad del "cliente") podria ser:

While elOrigen.HayMasDatos
miDato = New MisDatos
elOrigen.LlenarInstancia miDato
laColeccion.Add miDato
End While

Salud!

Preguntas similares