共用方式為


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:

  • 繼續逐一查看則沒有必要或是不可行。 錯誤值或終止要求可能會產生這個條件。

  • Try Catch Finally ……陳述式攔截例外狀況。 您可能在 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 時,編譯器才會偵測到這個重疊錯誤。

5z06z1kb.collapse_all(zh-tw,VS.110).gif步驟引數

step 值可為正值或負值。 這個參數決定處理根據下表的迴圈:

Step 值

執行迴圈的條件

正值或零

counter <= end

counter >= end

step 的預設值為 1。

5z06z1kb.collapse_all(zh-tw,VS.110).gif計數器引數

下表指出 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)

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

Exit 陳述式 (Visual Basic)

List<T>

概念

迴圈結構 (Visual Basic)

巢狀控制結構 (Visual Basic)

其他資源

集合 (C# 和 Visual Basic)