2011-11-11 9 views
5

Estoy iterando a través de una colección en un bucle foreach y me estaba preguntando. Cuando esto es ejecutado por el tiempo de ejecución de .NETColecciones utilizadas en el bucle foreach

foreach (object obj in myDict.Values) { 
    //... do something 
} 

hace el myDict.Values ​​conseguir invoca para cada bucle o se llama una sola vez?

Gracias,

Respuesta

9

Solo una vez. Es más o menos equivalente a:

using (IEnumerator<Foo> iterator = myDict.Values.GetEnumerator()) 
{ 
    while (iterator.MoveNext()) 
    { 
     object obj = iterator.Current; 
     // Body 
    } 
} 

Consulte la sección 8.8.4 de la especificación C# 4 para obtener más información. En particular, detalles sobre el tipo de elemento de iteración inferido, eliminación, y cómo el compilador de C# maneja los bucles foreach sobre los tipos que no implementan IEnumerable o IEnumerable<T>.

+1

Apuesto a que sabes la sección de memoria :) –

+0

Noble de ti para citar la especificación C# en lugar de C# en profundidad, 2nd Ed :) –

6

Respuesta breve: solo se llama una vez.

+1

Explicar: foreach toma el Enumerator (a través de la interfaz IEnumerable en su colección) y llama a Next() cada vez que pasa el bucle. –

2

Se llama una vez y generará una excepción si se modifica la colección.

+0

Depende de la modificación. –

+0

Sí, buen punto. Si solo se trata de un valor en una clase, esto no lo afectará, pero si se agregan o quitan elementos de la colección, esto es un problema. – James

Cuestiones relacionadas