Оценивается ли условие в цикле for каждую итерацию? - PullRequest
25 голосов
/ 17 марта 2009

Когда вы делаете что-то вроде:

for (int i = 0; i < collection.Count; ++i )

является ли collection.Count вызываемым на каждой итерации?

Изменится ли результат, если свойство Count будет динамически получать счет при вызове?

Ответы [ 4 ]

23 голосов
/ 17 марта 2009

Да Счет будет оцениваться на каждом проходе. Причина в том, что коллекция может быть изменена во время выполнения цикла. Учитывая структуру цикла, переменная i должна представлять действительный индекс в коллекции во время итерации. Если проверка не была сделана на каждом цикле, то это неправдоподобно. Пример дела

for ( int i = 0; i < collection.Count; i++ ) {
  collection.Clear();
}

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

for ( int i = 0; i < someArray.Length; i++ ) {
  // Code
}

CLR JIT будет в особых случаях использовать этот тип цикла при определенных обстоятельствах, поскольку длина массива не может измениться. В этих случаях проверка границ будет выполняться только один раз.

Ссылка: http://blogs.msdn.com/brada/archive/2005/04/23/411321.aspx

13 голосов
/ 17 марта 2009

Счет будет оцениваться при каждом проходе. Если вы продолжите добавлять в коллекцию, и итератор так и не дойдет до конца, у вас будет бесконечный цикл.

class Program
    {
        static void Main(string[] args)
        {
            List<int> intCollection = new List<int>();
            for(int i=-1;i < intCollection.Count;i++)
            {
                intCollection.Add(i + 1);
            }
        }
    }

Это в конечном итоге приведет к исключению нехватки памяти.

3 голосов
/ 17 марта 2009

Примечание: это НЕ проверяется для каждого взаимодействия в VB.

В отличие от C #, VB кэширует результат коллекции. Количество.

EDIT:

Буквальная версия V # цикла C # for:

Dim i = 0
Do While i < collection.Count
    'code goes here
    i+=1
Loop
3 голосов
/ 17 марта 2009

Да, счетчик проверяется при каждом вызове от первой итерации после инициализации i до последней итерации, когда проверка завершается неудачно и цикл for завершается. Вы можете изменить количество коллекций, если хотите, но понимаете, что можете оказаться в бесконечном цикле.

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