2011-11-11 14 views
5

Sto iterando attraverso una raccolta in un ciclo foreach e mi stavo chiedendo. Quando questo viene eseguito dal runtime .NETUtilizzo collezioni nel ciclo foreach

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

fa il myDict.Values ​​ottenere richiamato per ogni ciclo o si chiama una volta sola?

Grazie,

risposta

9

Solo una volta. È approssimativamente equivalente a:

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

Vedere la sezione 8.8.4 della specifica C# 4 per ulteriori informazioni. In particolare, i dettagli sul tipo di elemento di iterazione inferito, lo smaltimento e il modo in cui il compilatore C# gestisce i cicli foreach loop su tipi che non implementano IEnumerable o IEnumerable<T>.

+1

Scommetto che conosci la sezione a memoria :) –

+0

Nobile di voi per citare la Spec C# invece di C# in profondità, 2 ° Ed :) –

6

Risposta breve: viene chiamato solo una volta.

+1

Per esporre: foreach prende l'Enumeratore (tramite l'interfaccia IEnumerable sulla raccolta) e chiama Next() ogni volta attraverso il ciclo. –

2

Viene chiamato una volta e genera un'eccezione se la raccolta viene modificata.

+0

Dipende dalla modifica. –

+0

Sì, buon punto. Se è solo un valore in una classe, questo non lo farà, ma se gli oggetti vengono aggiunti o rimossi dalla collezione questo è un problema. – James