C# foreach循环内用MyArray[i]输出数组结果异常问题
C# foreach遍历int数组输出错位且不报错的原理
核心认知偏差
混淆了for循环和foreach循环的循环变量含义:
- 用
for循环按索引遍历数组时,循环变量存的是0到数组长度-1的索引值,需要通过数组[索引]的方式取元素 - 用
foreach遍历集合/数组时,循环变量存的直接是当前遍历到的元素本身,不是索引
输出结果匹配逻辑
测试数组定义为int[] MyArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 },数组长度为10,合法索引范围是0~9。
错误写法中,每一轮循环的执行逻辑如下:
- 第1轮:遍历到元素值1,执行
MyArray[1],取索引1位置的元素2 → 输出2 - 第2轮:遍历到元素值2,执行
MyArray[2],取索引2位置的元素3 → 输出3 - 第3到第9轮:遍历到的元素值依次为39,对应取索引39位置的元素,依次输出4、5、6、7、8、9、0
- 第10轮:遍历到元素值0,执行
MyArray[0],取索引0位置的元素1 → 输出1
最终输出序列恰好是2 3 4 5 6 7 8 9 0 1,和实际运行观测结果完全一致。
未触发异常的原因
本次错误写法没有抛出运行时异常属于纯粹的巧合:数组中存储的所有元素值刚好都落在0~9的合法索引区间内,每次调用MyArray[i]都访问到了数组的合法内存位置,自然不会触发IndexOutOfRangeException(索引越界异常)。
如果数组中存在小于0、或者大于等于10的元素值,这个错误写法会立刻抛出越界异常,不会静默运行。
错误写法复现
int[] MyArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; foreach (int i in MyArray) { Console.WriteLine(MyArray[i]); }
正确遍历写法
foreach循环不需要通过索引二次取值,直接输出循环变量即可:
int[] MyArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; foreach (var num in MyArray) { Console.WriteLine(num); }
内容的提问来源于stack exchange,提问作者Moarbidcan
相关产品推荐
相关产品推荐

