For...Next 陳述式 (Visual Basic)
按指定次數重複一組陳述式
For counter [ As datatype ] = start To end [ Step step ]
[ statements ]
[ Continue For ]
[ statements ]
[ Exit For ]
[ statements ]
Next [ counter ]
組件
組件 |
描述 |
---|---|
counter |
在 For 陳述式中為必要項。數值變數。迴圈 (Loop) 的控制項變數。如需詳細資訊,請參閱本主題中稍後的計數器引數。 |
datatype |
選擇項。counter 的資料型別。如需詳細資訊,請參閱本主題中稍後的計數器引數。 |
start |
必要項。數值運算式。counter 的初始值。 |
end |
必要項。數值運算式。counter 的最終值。 |
step |
選擇項。數值運算式。在迴圈中 counter 每次增加的數量。 |
statements |
選擇項。在 For 和 Next 之間執行指定次數的一或多個陳述式。 |
Continue For |
選擇項。將控制權轉移到下一個迴圈反覆運算。 |
Exit For |
選擇項。從 For 迴圈當中傳出控制權。 |
Next |
必要項。結束 For 迴圈的定義。 |
![]() |
---|
To 關鍵字可在此陳述式為計數器指定範圍。您可以在 Select...Case 陳述式 (Visual Basic) 和陣列宣告也可以使用這個關鍵字。如需陣列宣告的詳細資訊,請參閱 Dim 陳述式 (Visual Basic)。 |
簡單的範例
例如,當您想要重複一組陳述式數次時,您可以使用 ForNext …結構。
在下列範例中, index 變數是以值 1 並加入具有每次反覆運算迴圈,結束,在 index 到達 5. 之後的值。
For index As Integer = 1 To 5
Debug.Write(index.ToString & " ")
Next
Debug.WriteLine("")
' Output: 1 2 3 4 5
在下列範例中, number 變數從 2 開始減少 0.25 在每次反覆運算迴圈,結束,在 number 到達 0 後的值。-.25 的 Step 引數減少值的 0.25 在每次反覆運算迴圈。
For number As Double = 2 To 0 Step -0.25
Debug.Write(number.ToString & " ")
Next
Debug.WriteLine("")
' Output: 2 1.75 1.5 1.25 1 0.75 0.5 0.25 0
![]() |
---|
While...End While 陳述式 (Visual Basic) 或 Do...Loop 陳述式 (Visual Basic) 很適合使用,當您事先不知道次數執行迴圈中的陳述式。不過,若預期會執行特定次數的迴圈,則最好選用 For...Next 迴圈。初次進入迴圈時,判斷反覆運算的次數。 |
巢狀迴圈
您可以將一個迴圈置於另一個迴圈內,使 For 迴圈套疊成巢狀。下列範例示範具有不同間距值的巢狀 For...Next 結構。外部迴圈會在迴圈的每次反覆運算中建立字串。內部迴圈會在迴圈的每次反覆運算中遞減迴圈計數器變數。
For indexA = 1 To 3
' Create a new StringBuilder, which is used
' to efficiently build strings.
Dim sb As New System.Text.StringBuilder()
' Append to the StringBuilder every third number
' from 20 to 1 descending.
For indexB = 20 To 1 Step -3
sb.Append(indexB.ToString)
sb.Append(" ")
Next indexB
' Display the line.
Debug.WriteLine(sb.ToString)
Next indexA
' Output:
' 20 17 14 11 8 5 2
' 20 17 14 11 8 5 2
' 20 17 14 11 8 5 2
當巢狀迴圈,每個迴圈必須具備唯一的 counter 變數。
您可以將不同類型的控制結構相互套疊成巢狀。如需詳細資訊,請參閱巢狀控制結構 (Visual Basic)。
關閉並繼續。
Exit For 陳述式會立即關閉 ForNext …迴圈和將控制權傳輸至接在 Next 陳述式的陳述式。
Continue For 陳述式會立即將控制權轉移至迴圈的下一個反覆運算。如需詳細資訊,請參閱Continue 陳述式 (Visual Basic)。
下列範例說明 Continue For 和 Exit For 陳述式的用法。
For index As Integer = 1 To 100000
' If index is between 5 and 7, continue
' with the next iteration.
If index >= 5 And index <= 8 Then
Continue For
End If
' Display the index.
Debug.Write(index.ToString & " ")
' If index is 10, exit the loop.
If index = 10 Then
Exit For
End If
Next
Debug.WriteLine("")
' Output: 1 2 3 4 9 10
您可以將任意數目的 Exit For 陳述式放在 For…Next 迴圈中。用於巢狀的 For…Next 迴圈內時,Exit For 會退出最內層的迴圈,並將控制權轉移到下一個較高的巢狀層次。
Exit For ,通常會在評估某些條件之後 (例如,在 If…Then…Else 結構)。在下列情況中,您可能會想要使用 Exit For:
繼續逐一查看則沒有必要或是不可行。錯誤值或終止要求可能會產生這個條件。
TryCatchFinally ……陳述式攔截例外狀況。您可能在 Finally 區塊的結尾處使用 Exit For。
您有一個無限迴圈,迴圈就是會執行大或甚至無限次數。如果您偵測到這類狀況,可以使用 Exit For 逸出此迴圈。如需詳細資訊,請參閱Do...Loop 陳述式 (Visual Basic)。
技術實作
當 For...Next 迴圈開始時,Visual Basic 會評估 start、end 和 step。Visual Basic 此時只評估這些值並將 start 設為 counter。在陳述式區塊執行之前, Visual Basic 與 end比較的 counter 。如果 counter 大於 end 值 (或小,如果 step 是負值), For 迴圈結束和控制項傳遞至已在 Next 之後的陳述式之後的陳述式。否則,陳述式區塊執行。
Visual Basic 每次遇到 Next 陳述式時,便會依 step 遞增 counter,並回到 For 陳述式。接著再比較 counter 和 end,然後根據結果重新執行區塊或結束迴圈。這個處理序會一直繼續,直到 counter 超過 end 或遇到 Exit For 陳述式為止。
迴圈不會停止,直到 counter 傳遞 end。如果 counter 等於 end,則迴圈會繼續執行。如果 step 是正值,則判斷是否執行區塊的比較為 counter <= end,如果 step 是負值則為 counter >= end。
如果您變更 counter 的值,在迴圈內時,您的程式碼可能更難閱讀及偵錯。變更 start的值為 end,或者 step 不會影響已決定的反覆項目值,當初次進入迴圈。
如果巢狀迴圈,編譯器會發出錯誤信號,如果它在內部層級的 Next 陳述式之前遇到外層巢狀層次的 Next 陳述式。但是,只有當您在每個 Next 陳述式中指定 counter 時,編譯器才會偵測到這個重疊錯誤。
步驟引數
step 值可為正值或負值。這個參數決定處理根據下表的迴圈:
Step 值 |
執行迴圈的條件 |
---|---|
正值或零 |
counter <= end |
負 |
counter >= end |
step 的預設值為 1。
計數器引數
下表指出 counter 是否定義範圍是整個 For…Next 迴圈的新的區域變數。這個解析 datatype 決定是否存在,而且 counter 是否已定義。
datatype 上是否有? |
counter 已經定義? |
結果 ( counter 是否定義範圍是整個 For...Next 迴圈) 的新的區域變數 |
---|---|---|
否 |
是 |
否,,因為 counter 已經定義。如果 counter 範圍不是在程序中,編譯時期警告出現。 |
否 |
否 |
是。資料型別是 start、 end和 step 運算式推斷。如需型別推斷的詳細資訊,請參閱 Option Infer 陳述式 和 區域型別推斷 (Visual Basic)。 |
是 |
是 |
是,,不過,只有在現有 counter 變數在程序外定義。該變數維持不同。如果現有的 counter 變數的範圍是在程序中,編譯時期發生錯誤。 |
是 |
否 |
是。 |
counter 的資料型別決定反覆項目類型,必須是下列其中一種型別:
Byte、SByte、UShort、Short、UInteger、Integer、ULong、Long、Decimal、Single 或 Double。
您使用 Enum 陳述式 (Visual Basic)宣告的列舉。
Object。
具有下列運算子的型別 T,其中 B 是可在 Boolean 運算式中使用的型別。
Public Shared Operator >= (op1 As T, op2 As T) As B
Public Shared Operator <= (op1 As T, op2 As T) As B
Public Shared Operator - (op1 As T, op2 As T) As T
Public Shared Operator + (op1 As T, op2 As T) As T
您可以在 Next 陳述式可以選擇性地指定 counter 變數。尤其是在您具有巢狀 For 迴圈,這個語法能提高程式的可讀性。您必須指定出現在對應的 For 陳述式的變數。
start、end 和 step 運算式可以評估擴展至 counter 型別的任何資料型別。如果您使用 counter的使用者定義型別,您可能必須定義 CType 轉換運算子 start、 end或 step 的型別為 counter的型別。
範例
下列範例會移除泛型清單中的所有項目。而不是 For Each...Next 陳述式 (Visual Basic),這個範例會示範以遞減順序逐一查看的 For…Next 陳述式。因為 removeAt 方法所移除的項目之後建立項目具有較低的索引值,這個範例會使用這個技術。
Dim lst As New List(Of Integer) From {10, 20, 30, 40}
For index As Integer = lst.Count - 1 To 0 Step -1
lst.RemoveAt(index)
Next
Debug.WriteLine(lst.Count.ToString)
' Output: 0
下列範例會使用 Enum 陳述式 (Visual Basic),宣告的逐一查看列舉型別。
Public Enum Mammals
Buffalo
Gazelle
Mongoose
Rhinoceros
Whale
End Enum
Public Sub ListSomeMammals()
For mammal As Mammals = Mammals.Gazelle To Mammals.Rhinoceros
Debug.Write(mammal.ToString & " ")
Next
Debug.WriteLine("")
' Output: Gazelle Mongoose Rhinoceros
End Sub
在下列範例中,陳述式參數會使用具有 +、-、>= 和 <= 運算子多載運算子的類別。
Private Class Distance
Public Property Number() As Double
Public Sub New(ByVal number As Double)
Me.Number = number
End Sub
' Define operator overloads to support For...Next statements.
Public Shared Operator +(ByVal op1 As Distance, ByVal op2 As Distance) As Distance
Return New Distance(op1.Number + op2.Number)
End Operator
Public Shared Operator -(ByVal op1 As Distance, ByVal op2 As Distance) As Distance
Return New Distance(op1.Number - op2.Number)
End Operator
Public Shared Operator >=(ByVal op1 As Distance, ByVal op2 As Distance) As Boolean
Return (op1.Number >= op2.Number)
End Operator
Public Shared Operator <=(ByVal op1 As Distance, ByVal op2 As Distance) As Boolean
Return (op1.Number <= op2.Number)
End Operator
End Class
Public Sub ListDistances()
Dim distFrom As New Distance(10)
Dim distTo As New Distance(25)
Dim distStep As New Distance(4)
For dist As Distance = distFrom To distTo Step distStep
Debug.Write(dist.Number.ToString & " ")
Next
Debug.WriteLine("")
' Output: 10 14 18 22
End Sub
請參閱
參考
While...End While 陳述式 (Visual Basic)