Do...Loopループは、For(カウンタ指向)やWhile(常に入口で条件がチェックされる)よりも、より柔軟な終了条件でコードブロックの繰り返しを編成できます。Visual Basicには、4つの基本的な記述バリエーションがあります:
' 入口でのチェック Do While condition ' ループの本体 Loop ' 出口でのチェック Do ' ループの本体 Loop While condition ' Untilを使用した同様の形式: Do Until condition ' ループの本体 Loop Do ' ループの本体 Loop Until condition
Do...Loopを使用するべき場合:
質問: Do While condition内で、条件conditionが最初から偽であった場合、ループの本体は1回でも実行されるでしょうか?
回答: いいえ、ループの本体はまったく実行されません。なぜなら、チェックは最初の実行前に行われるからです。
例:
Dim i As Integer = 10 Do While i < 5 Console.WriteLine(i) i += 1 Loop ' 一行も出力されません。
物語
データをパースする時点で、開発者は
Do Until reader.EndOfStreamループを使用し、その中でファイルの行を読み込んでいました。しかし、EndOfStreamはファイルの外で読み込もうとするまで真にならないため、最後の行は処理されませんでした。正しい方法は、Do While Not reader.EndOfStreamを使用するか、条件EOFでループを終了させるために行ごとに読み込むことです。
物語
ForからDo...Loopにコードを移行する際、ループ内部にカウンタ変数の明示的なインクリメントを実装しないループが作成されました。その結果、終了条件が決して満たされず、プログラムは無限ループに陥りました。常にDo...Loopの本体内で主要な変数の変更を監視することが必要です。
物語
ある報告システムのサブシステムで、プログラマーはネストされた
Do...Loopループを用いて、Exit Doの条件のネストについて考慮していませんでした:内部のExit Doは内部ループからのみ抜け出し、両方からは抜け出しませんでした。大規模なデータでのみ、短期間のブロッキングバグが発見されました。