Когда вы делаете такие вещи, как:
for (int i = 0; i < collection.Count; ++i )
is collection.Count вызывается на каждой итерации?
Будет ли результат изменяться, если свойство Count динамически получает счетчик при вызове?
Когда вы делаете такие вещи, как:
for (int i = 0; i < collection.Count; ++i )
is collection.Count вызывается на каждой итерации?
Будет ли результат изменяться, если свойство Count динамически получает счетчик при вызове?
Да Счет будет оцениваться на каждом проходе. Причина в том, что возможность сбора коллекции может быть изменена во время выполнения цикла. Учитывая структуру цикла, переменная я должна представлять действительный индекс в коллекции во время итерации. Если проверка не была выполнена в каждом цикле, это не оправдано. Пример 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
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);
}
}
}
В итоге это приведет к исключению из памяти.
Да счетчик проверяется при каждом вызове с первой итерации после инициализации я до последней итерации, где проверка завершается с ошибкой, и цикл for завершается. Вы можете изменить кол-во коллекций, если хотите, но осознаете, что можете оказаться в бесконечном цикле.
Боковое примечание, это НЕ проверяется на каждое вмешательство в VB.
В отличие от С#, VB кэширует результат коллекции. Count.
EDIT:
Литеральная версия цикла С# for:
Dim i = 0
Do While i < collection.Count
'code goes here
i+=1
Loop