Duda en carga de Coleccion

21/10/2007 - 02:29 por Guillermo Peralta | Informe spam
Hola a todos;

Tengo el siguiente codigo:


//se carga en un SqlDataReader el resultado de una consulta
SqlDataReader oReader = oCmd.ExecuteReader ();

//Coleccion Generic de la clase Modulo
Modulos Modulos = new Modulos () ;

Modulo oMod = new Modulo(); // (1)

while (oReader.Read ())
{
Modulo oMod = new Modulo(); // (2)

oMod.IdModulo = (int) oReader["IdModulo"];
oMod.IdProducto = (int) oReader ["IdProducto"];
oMod.NombreModulo = oReader["NombreModulo"].ToString ();

//agrega nuevo elemento a la coleccion
Modulos.Add (oMod);
}

La duda que tengo es que si yo comento la linea marcada con (2) dentro del
bucle y solo instancio un solo objeto de la clase Modulo ( linea marcada con
(1) ) , todos los elementos de la coleccion quedan iguales al finalizar el
bucle, es decir, si la consulta me devuelve 1,2,3,4, en la coleccion yo
tengo 4,4,4,4
Si dejo la instancia del objeto dentro del bucle esto no ocurre.

No acabo de entender este comportamiento, puede alguien explicarmelo?

La otra consulta que tengo es si existe otra forma mas eficiente de cargar
una coleccion con el resultado de la consulta obtenida por SqlCommand.

Muchas gracias

Saludos
Guillermo
AG-CBA-ARG
 

Leer las respuestas

#1 Bela Istok
21/10/2007 - 08:02 | Informe spam
En .net las variables tienen alcance, y tu tienes 2 variables llamadas oMod
una externa (seguramente dentro de un método) y otra interna que pertenece
al while, y parece que el compilador esta tomando es la externa, puedes
probar 2 cosas primero comenta la línea marcada con (1) o segundo quita en
la línea marcada con (2) el Modulo para que quede algo así como esto: oMod =
new Modulo();

PD: La razón por la que en tu colección todos los elementos quedan con 4 es
que es una variable por referencia y tu estas añadiendo 4 veces la
referencia y los valores cambian en cada iteración del while.

PD2: hay muchas otras formas de hacerla, pero básicamente esa es la mas
usada.

Saludos,

Bela Istok
"Guillermo Peralta" wrote in message
news:%
Hola a todos;

Tengo el siguiente codigo:


//se carga en un SqlDataReader el resultado de una consulta
SqlDataReader oReader = oCmd.ExecuteReader ();

//Coleccion Generic de la clase Modulo
Modulos Modulos = new Modulos () ;

Modulo oMod = new Modulo(); // (1)

while (oReader.Read ())
{
Modulo oMod = new Modulo(); // (2)

oMod.IdModulo = (int) oReader["IdModulo"]; oMod.IdProducto = (int)
oReader ["IdProducto"];
oMod.NombreModulo = oReader["NombreModulo"].ToString ();

//agrega nuevo elemento a la coleccion
Modulos.Add (oMod);
}

La duda que tengo es que si yo comento la linea marcada con (2) dentro del
bucle y solo instancio un solo objeto de la clase Modulo ( linea marcada
con (1) ) , todos los elementos de la coleccion quedan iguales al
finalizar el bucle, es decir, si la consulta me devuelve 1,2,3,4, en la
coleccion yo tengo 4,4,4,4
Si dejo la instancia del objeto dentro del bucle esto no ocurre.

No acabo de entender este comportamiento, puede alguien explicarmelo?

La otra consulta que tengo es si existe otra forma mas eficiente de cargar
una coleccion con el resultado de la consulta obtenida por SqlCommand.

Muchas gracias

Saludos
Guillermo
AG-CBA-ARG

Preguntas similares