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)