Подтвердить что ты не робот

Является ли условие в цикле for для каждой итерации?

Когда вы делаете такие вещи, как:

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 4

Боковое примечание, это НЕ проверяется на каждое вмешательство в VB.

В отличие от С#, VB кэширует результат коллекции. Count.

EDIT:

Литеральная версия цикла С# for:

Dim i = 0
Do While i < collection.Count
    'code goes here
    i+=1
Loop