问题历史
For...Next循环自Visual Basic的早期版本以来就存在,允许遍历值的范围,常用于处理数组和集合。在VB.NET中增加了语义上更严格的计数器和步骤(Step)的支持。
问题
经典错误是修改循环计数器的值(例如i),这导致错误行为:计数器在每次迭代结束时仍然会自动递增/递减。同时,正确设定集合的遍历边界也非常重要(例如,For i = 0 To arr.Length - 1)。
解决方案
始终使用不可更改的计数器,或者如果集合可能在循环内部更改,则立即将上限表达式放入变量中。不要在循环体内显式地更改计数器变量。
示例代码:
Dim arr() As Integer = {1, 2, 3, 4} For i As Integer = 0 To arr.Length - 1 Console.WriteLine(arr(i)) Next
关键特性:
如果在循环体内手动更改计数器,会发生什么?
值仅在当前迭代内实际更改,但在迭代结束时,Visual Basic会自动执行递增/递减,这将导致不可预测的遍历次数。
For i = 1 To 5 If i = 3 Then i = 1 Console.WriteLine(i) Next
可以使用For...Next遍历集合类型List(Of T)吗?
可以,但建议在集合上使用For Each,以避免因大小可变而导致的错误。For...Next仅存储索引。
如果上限小于下限并且步长为正,会发生什么?
循环将不会执行一次。
For i = 5 To 1 '没有Step - 循环将不会执行 ... Next
当发现特定元素时手动更改计数器,试图跳过后续元素导致跳过某些迭代并进入无限循环。
优点:
缺点:
使用单独的变量控制条件,不干涉循环计数器。
优点:
缺点: