問題の背景
For...NextループはVisual Basicの初期バージョンから存在し、値の範囲を繰り返し処理することを可能にし、配列やコレクションでよく使用されます。VB.NETでは、意味的により厳しいカウンタとステップ(Step)のサポートが追加されました。
問題
典型的なエラーは、ループカウンタの値(たとえば、i)を変更することにより、意図しない動作を引き起こすことです:カウンタは各反復の最後に自動的にインクリメント/デクリメントされます。また、コレクションをループする際には、正しい範囲を設定することが重要です(たとえば、For i = 0 To arr.Length - 1)。
解決策
常に変更されないカウンタを使用するか、ループ内でコレクションが変更される可能性がある場合は、上限の式を変数に直接代入してください。ループ内でカウンタ変数を明示的に変更しないでください。
コード例:
Dim arr() As Integer = {1, 2, 3, 4} For i As Integer = 0 To arr.Length - 1 Console.WriteLine(arr(i)) Next
主な特徴:
ループ内でカウンタを手動で変更するとどうなりますか?
値は現在の反復内で実際に変更されますが、反復の終了時にVisual Basicは自動的にインクリメント/デクリメントを実行するため、予測不可能な反復数が発生します。
For i = 1 To 5 If i = 3 Then i = 1 Console.WriteLine(i) Next
For...NextはList(Of T)のようなコレクションをループするために使用できますか?
はい、可能ですが、サイズが変更されるエラーを避けるためにコレクションにはFor Eachを使用することをお勧めします。For...Nextはインデックスのみを記憶します。
正のステップで上限が下限より小さい場合はどうなりますか?
ループは一度も実行されません。
For i = 5 To 1 ' Stepなしで - ループは実行されません ... Next
特定の要素を見つけたときにカウンタが手動で変更され、将来の要素をスキップしようとした結果、いくつかの反復がスキップされ、無限ループが発生しました。
利点:
欠点:
条件管理に別の変数を使用し、ループカウンタへの干渉がないことを保ちました。
利点:
欠点: