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