Целостность цикла .NET 101 - PullRequest
3 голосов
/ 10 февраля 2012

Меня всегда смущало это.Рассмотрим следующие циклы:

int [] list = new int [] { 1, 2, 3 };  
for (int i=0; i < list.Length; i++) { }  
foreach (int i in list) { }  
while (list.GetEnumerator().MoveNext()) { } // Yes, yes you wouldn't call GetEnumerator with the while. Actually never tried that.  
  • [список] выше жестко запрограммированЧто произойдет, если список будет изменен извне, пока цикл проходит итерации?Было бы это расстроить петлю.Если нет, то будет ли он создавать новый экземпляр в каждой итерации?

1 Ответ

6 голосов
/ 10 февраля 2012

Хорошо:

  • Цикл for проверяет list.Length на каждой итерации; вы на самом деле не обращаетесь к list в цикле, поэтому содержимое не будет иметь значения
  • Цикл foreach использует только list для получения итератора; изменение его для ссылки на другой список не будет иметь никакого значения, но если вы измените сам список структурно (например, добавив значение, если это действительно List<int> вместо int[]), это сделает недействительным итератор
  • Ваш третий пример, как написано, будет продолжаться вечно, если список не будет очищен, учитывая, что он будет каждый раз получать новый итератор. Если вы хотите более разумное объяснение, напишите более разумный код

По сути, вам нужно понять разницу между содержимым массива и изменением того, к какому объекту относится переменная - и затем дать нам очень конкретную ситуацию для объяснения. В общем случае цикл foreach непосредственно касается исходного выражения только один раз, когда он выбирает итератор, тогда как цикл for не имеет никакого волшебства, и как часто к нему обращаются, просто зависит от кода - и условие, и часть "step" цикла for выполняется на каждой итерации, поэтому, если вы обратитесь к переменной в любой из этих частей, вы увидите какие-либо изменения ...

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