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

голоса
24

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

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

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

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

Задан 17/03/2009 в 18:58
источник пользователем
На других языках...                            


4 ответов

голоса
21

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

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

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

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

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

Справка: http://blogs.msdn.com/brada/archive/2005/04/23/411321.aspx

Ответил 17/03/2009 в 19:17
источник пользователем

голоса
13

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

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);
            }
        }
    }

Это в конечном итоге получить из исключения памяти.

Ответил 17/03/2009 в 19:01
источник пользователем

голоса
3

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

Ответил 17/03/2009 в 19:06
источник пользователем

голоса
2

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

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

РЕДАКТИРОВАТЬ:

Буквальная версия VB из C # для петли:

Dim i = 0
Do While i < collection.Count
    'code goes here
    i+=1
Loop
Ответил 17/03/2009 в 19:20
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more