Коллекции используют в цикле foreach - PullRequest
5 голосов
/ 11 ноября 2011

Я перебираю коллекцию в цикле foreach, и мне было интересно.Когда это выполняется во время выполнения .NET

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

Вызывается ли myDict.Values ​​для каждого цикла или он вызывается только один раз?

Спасибо,

Ответы [ 3 ]

9 голосов
/ 11 ноября 2011

Всего один раз. Это примерно эквивалентно:

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

См. Раздел 8.8.4 спецификации C # 4 для получения дополнительной информации. В частности, подробности о предполагаемом типе элемента итерации, об использовании и о том, как компилятор C # обрабатывает циклы foreach над типами, которые не реализуют IEnumerable или IEnumerable<T>.

6 голосов
/ 11 ноября 2011

Краткий ответ: вызывается только один раз.

2 голосов
/ 11 ноября 2011

Он вызывается один раз и генерирует исключение при изменении коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...