For...Next ステートメント (Visual Basic)
指定された回数だけ、一連のステートメントを繰り返すフロー制御ステートメントです。
For counter [ As datatype ] = start To end [ Step step ]
[ statements ]
[ Continue For ]
[ statements ]
[ Exit For ]
[ statements ]
Next [ counter ]
指定項目
指定項目 |
説明 |
---|---|
counter |
For ステートメントには必ず指定します。 数値変数を指定します。 このループの制御変数になります。 詳細については、このトピックで後述する「counter 引数」を参照してください。 |
datatype |
省略可能です。 counter のデータ型を指定します。 詳細については、このトピックで後述する「counter 引数」を参照してください。 |
start |
必須です。 数式を指定します。 counter の初期値になります。 |
end |
必須です。 数式を指定します。 counter の最終値になります。 |
step |
省略可能です。 数式を指定します。 ループを 1 回実行するごとに引数 counter を増やす量です。 |
statements |
省略可能です。 For と Next の間に記述したステートメントは、指定した回数だけ実行されます。 |
Continue For |
省略可能です。 制御をループの次の反復処理に移します。 |
Exit For |
省略可能です。 制御を For ループの外に移します。 |
Next |
必須です。 For ループの定義を終了します。 |
注意
このステートメントで To のキーワードがカウンターの範囲を指定するために使用されます。また Select...Case ステートメント (Visual Basic) と配列申告でこのキーワードを使用できます。配列の宣言の詳細については、「Dim ステートメント (Visual Basic)」を参照してください。
簡単な例
回数の一連のステートメントを繰り返し実行する場合に For…Next の構造を使用します。
次の例では、1 の値を持つ index の変数の先頭は index の到達 5.の値の後に終了した場合は、ループ反復ごとにインクリメントします。
For index As Integer = 1 To 5
Debug.Write(index.ToString & " ")
Next
Debug.WriteLine("")
' Output: 1 2 3 4 5
次の例では、2 時の number の変数の先頭は number の到達 0 の値の終了後にループの各反復処理の軽減され、0.25。 -.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 ループは入れ子構造にできます。つまり、ループの中に別のループを入れることができます。 次の例は、それぞれ異なる step 値を指定した入れ子になった 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 のステートメントは Next のステートメントの次のステートメントにすぐに For[…]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 は最も内側のループを抜け、入れ子構造の 1 つ外側のレベルに制御を移します。
Exit For は条件を評価した後によく使用されます (たとえば、If…Then…Else の構造体) 次のような条件の場合に Exit For を使用できます。
ループの継続が不要または不可能である。 エラー値または終了要求はこの要件を作成する場合があります。
Try…Catch…Finally のステートメントで例外をキャッチします。 Finally ブロックの最後で Exit For を使用できます。
大きい、または無限実行回数が多いループになります。無限ループがあります。 このような条件を検出した場合は、Exit For を使用してループを抜けることができます。 詳細については、「Do...Loop ステートメント (Visual Basic)」を参照してください。
技術的な実装
For...Next ループが開始されると、start、end、および step が評価されます。 Visual Basic は、現時点でのみこれらの値を評価し、counterに start を再配置。 ステートメント ブロックの実行、Visual Basic が endに counter を比較する前に、 counter が既に場合は step が負の場合 end の値 (またはそれより小さい)、Next のステートメントの次のステートメントに For のループの終わりとコントロールのパス。 それ以外の場合は、ステートメント ブロックが実行されます。
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 には正の数または負の数を指定できます。 このパラメーターには、次の表に従って、ループの処理方法を決定します:
ステップの値 |
実行条件 |
---|---|
正の数または 0 |
counter <= end |
負 |
counter >= end |
step の既定値は 1 です。
counter 引数
次の表は counter が For…Next のループ スコープに新しいローカル変数を定義するかどうかを示します。 この確認は datatype があるかどうか、および counter が既に定義されているかどうかによって異なります。
datatype ですか。 |
counter は既に定義されていますか。 |
(counter が For...Next のループ スコープに新しいローカル変数を定義するかどうか結果) |
---|---|---|
X |
○ |
counter が既に定義されているため、No。 counter の範囲がプロシージャにローカルである、コンパイル時に警告が発生します。 |
X |
X |
はい。 データ型は start、endと step の式から推論されます。 型の推論については、Option Infer ステートメント と ローカル型の推論 (Visual Basic)を参照してください。 |
○ |
○ |
counter の既存の変数がプロシージャの外部で定義された場合にのみ○ (ただし。 この変数は別に残ります。 counter の既存の変数のスコープがプロシージャにローカルな場合、コンパイル エラーが発生します。 |
○ |
X |
はい。 |
counter のデータ型は次の型の 1 つが必要があるイテレーションの型が決まります:
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のユーザー定義型を使用すると、counterの種類に start、end、または step の型を変換するには CType の変換演算子を定義しなければならない場合があります。
使用例
次の例では、ジェネリック リストからすべての要素を削除しています。 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)