2009-01-28 14 views
7

yo estaba trabajando con algo de código C# hoy por la mañana y que tenía algo así como:¿Se llama a un método que devuelve una colección en cada iteración en una instrucción foreach en C#?

foreach(DataRow row in MyMethod.GetDataTable().Rows) { 
//do something 
} 

Así que, como no tienen una comprensión completa del marco idioma Me gustaría saber si GetDataTable() se llama cada vez que se realiza una iteración o si simplemente se llama una vez y los datos resultantes (que serían Filas) se guardan en la memoria para recorrerlos. En cualquier caso, declaré una nueva colección para guardarlo y trabajar desde allí ...

he añadido una nueva variable así que en vez que hice:

DataRowCollection rowCollection = MyMethod.GetDataTable().Rows; 
foreach(DataRow row in rowCollection) { 
//do something 
} 

pero no estoy muy seguro de si esto es necesario.

Gracias de antemano.

+0

Estoy de acuerdo con las respuestas aquí. Solo se llama una vez. Si tiene dudas en otras situaciones, intente poner un punto de quiebre en GetDataTable() y vea cuántas veces se golpea. –

Respuesta

11

No te preocupes; solo ejecutará GetDataTable() una vez internamente para obtener el objeto enumerador de DataRowCollection, y luego buscará un nuevo elemento cada vez que ejecute el ciclo.

1

Solo se llama una vez y luego se almacena.

0

Lo que estás haciendo es esencialmente lo mismo. En la primera situación, está creando una referencia a la clase DataRowCollection y luego ejecuta el foreach, y en el primero, no está creando la referencia. En ambas situaciones, está llamando a .GetEnumerator() en la instancia de DataRowCollection que está en el montón.

Lo invocará en la instancia una vez que la instancia se haya recuperado del método GetDataTable().

GetDataTable() se llama solo una vez.

2

Gustavo - parafraseando a un viejo profesor de CS: ¡el depurador es tu amigo! Si tiene unos minutos y algo de paciencia, podría envolver la extracción de la tabla en otra clase y colocar allí un punto de interrupción. Descubrirá que, de hecho, se crea un objeto para que la llamada no se repita.

3

un bucle foreach es sólo el azúcar sintáctica para

var enumerator = MyMethod.GetDataTable().Rows.GetEnumerator(); 
while (enumerator.MoveNext()) 
{ 
    DataRow row = enumerator.Current; 
    // Initial foreach content 
} 
+0

¡Esta es una muy buena respuesta, gracias! –

Cuestiones relacionadas