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,則為必要項。 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)

備註

當您要多次重複執行一組陳述式時,請使用 For...Next 結構。

當 For...Next 迴圈開始時,Visual Basic 會評估 start、end 和 step。 只有在此時,才會評估這些值。 接著指派 start 給 counter。 在它執行陳述式區塊之前,會比較 counter 和 end。 如果 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 的值不會影響初次進入迴圈時判斷的反覆運算值。

秘訣秘訣

當您事先不知道需要在迴圈中執行多少次陳述式時,很適合使用 While...End While 陳述式 (Visual Basic)Do...Loop 陳述式 (Visual Basic)。 不過,若預期會執行特定次數的迴圈,則最好選用 For...Next 迴圈。 初次進入迴圈時,判斷反覆運算的次數。

步驟引數

step 值可為正值或負值。 它會判斷迴圈處理,如下所示:

Step 值

執行迴圈的條件

正值或零

counter <= end

負值

counter >= end

若未指定時,step 預設值為 1。

計數器引數

如果尚未在這個迴圈外宣告 counter,就必須在 For 陳述式中宣告它。 在這個情況下,counter 的範圍是迴圈的主體。 但不能在迴圈內外宣告 counter。

您可以在 Next 陳述式中選擇性地指定 counter。 這能提高程式的可讀性,尤其是在您具有巢狀 For 迴圈時。 所指定的變數必須和相對應之 For 陳述式中出現的變數相同。

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

start、end 和 step 運算式可以評估擴展至 counter 型別的任何資料型別。 如果對 counter 採用使用者定義的型別,這表示您可能必須定義 CType 轉換運算子,將 start、end 或 step 的型別轉換為 counter 型別。

巢狀迴圈

您可以將一個迴圈置於另一個迴圈內,使 For 迴圈套疊成巢狀。 不過,每個迴圈必須具備唯一的 counter 變數。

您可以將不同類型的控制結構相互套疊成巢狀。 如需詳細資訊,請參閱巢狀控制結構 (Visual Basic)

如果先發現外部巢狀層次的 Next 陳述式才發現內部層次的 Next,編譯器會發出錯誤的信號。 但是,只有當您在每個 Next 陳述式中指定 counter 時,編譯器才會偵測到這個重疊錯誤。

Exit For

Exit 陳述式 (Visual Basic) 會立即結束 For…Next 迴圈,並將控制權轉移給 Next 陳述式隨後的陳述式。

您可以將任意數目的 Exit For 陳述式放在 For…Next 迴圈中。 用於巢狀的 For…Next 迴圈內時,Exit For 會退出最內層的迴圈,並將控制權轉移到下一個較高的巢狀層次。

Exit For 通常會在評估一些條件之後使用,例如 If...Then...Else 結構。 在下列情況中,您可能會想要使用 Exit For:

  • 繼續逐一查看則沒有必要或是不可行。 這可能是因為錯誤值或終止要求所造成。

  • 在 Try...Catch...Finally 中攔截到例外狀況。 您可能在 Finally 區塊的結尾處使用 Exit For。

  • 發生無止盡迴圈,這是可以執行龐大甚或無限次數的迴圈。 如果您偵測到這類狀況,可以使用 Exit For 逸出此迴圈。 如需詳細資訊,請參閱Do...Loop 陳述式 (Visual Basic)

Continue For 陳述式會立即將控制權轉移至迴圈的下一個反覆運算。 如需詳細資訊,請參閱Continue 陳述式 (Visual Basic)

範例

下列範例說明 For…Next 陳述式的用法。 迴圈計數器變數會隨迴圈的每次反覆運算遞增。 step 引數未指定,因此預設為 1。

For index As Integer = 1 To 5
    Debug.Write(index.ToString & " ")
Next
Debug.WriteLine("")
' Output: 1 2 3 4 5

在下列範例中,counter 和 step 參數是 Double 浮點數。

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 

下列範例示範具有不同間距值的巢狀 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

下列範例會移除泛型清單中的所有項目。 這裡使用的不是 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

下列範例說明 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

下列範例會逐一查看使用 Enum 陳述式 (Visual Basic) 所宣告的列舉。

Public Enum Mammals
    Buffalo
    Gazelle
    Mongoose
    Rhinocerous
    Whale
End Enum


Public Sub ListSomeMammals()
    For mammal As Mammals = Mammals.Gazelle To Mammals.Rhinocerous
        Debug.Write(mammal.ToString & " ")
    Next
    Debug.WriteLine("")
    ' Output: Gazelle Mongoose Rhinocerous
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

請參閱

工作

HOW TO:改善迴圈的效能 (Visual Basic)

參考

While...End While 陳述式 (Visual Basic)

Do...Loop 陳述式 (Visual Basic)

Exit 陳述式 (Visual Basic)

For Each...Next 陳述式 (Visual Basic)

List<T>

概念

迴圈結構 (Visual Basic)

巢狀控制結構 (Visual Basic)

變更記錄

日期

記錄

原因

2010 年 12 月

已重新組織<備註>一節並加入範例。

資訊加強。