continue
最近、私はオープンソースプロジェクトを経験していて、.NETで数年間開発してきましたが、これまでキーワードに出くわしたことはありませんでした。
質問:continue
キーワードを使用することでメリットが得られるベストプラクティスまたは領域は何ですか?以前に見たことがなかった理由はありますか?
これを使用して、現在のループの反復をすぐに終了し、該当する場合は次の反復を開始します。
foreach (var obj in list)
{
continue;
var temp = ...; // this code will never execute
}
Acontinue
は通常、条件に関連付けられており、条件は通常、continue
;の代わりに使用できます。
foreach (var obj in list)
{
if (condition)
continue;
// code
}
と書くことができます
foreach (var obj in list)
{
if (!condition)
{
// code
}
}
continue
if
ループ内に複数のレベルのネストされたロジックがある場合は、より魅力的になります。ネストするcontinue
代わりに、コードを読みやすくすることができます。もちろん、ループと条件を適切なメソッドにリファクタリングすると、ループが読みやすくなります。
キーワードは、ループブロックのcontinue
残りをスキップして続行するために使用されます。例えば:
for(int i = 0; i < 5; i++)
{
if(i == 3) continue; //Skip the rest of the block and continue the loop
Console.WriteLine(i);
}
印刷します:
0
1
2
4
深い入れ子を防ぎます。
foreach(var element in collection)
{
doSomething();
doSomethingElse();
if (condition1)
{
action1();
action2();
if (condition2)
{
action3();
}
}
}
次のように書き直すことができます
foreach(var element in collection)
{
doSomething();
doSomethingElse();
if (!condition1)
{
continue;
}
action1();
action2();
if (!condition2)
{
continue;
}
action3();
}
コードブロックが簡単ではなく垂直方向に大きい場合は、を使用するとcontinue
コードの可読性が向上する可能性があります。明らかに、他のすべての言語構成と同様に、考慮して使用する必要があります。
ループから抜けたくないbreak
が、次の反復が必要な場合:
for (int i = 0; i < something; i++)
{
if (condition)
continue;
// expensive calculations, skip due to continue
// or due to the condition above I don't want to
// run the following code
stuff();
code();
}
慎重に使用する必要があります。
最良の(=読みやすい)ループはbreak
またはcontinue
を使用しません。これらは一種の構造化されたgotoステートメントです。
そうは言っても、1つまたは2つのbreak / continueステートメントでループが読み取れなくなることはありませんが、それらの使用法を明確にし、単純に保つことにはメリットがあります。
基本的continue
に、break
より良い(しかししばしば偽装された)goto
ステートメント...
ループ内にいて、ループ内で次に来るすべてのものをスキップして、使用できる次の反復を続行する必要があることを知っているときはいつでもcontinue
...
そのため、それらはめったに使用されるべきではありません...時々それらはコードを非常に読みやすく明確にします(例えば、代替がいくつかのレベルのネストである場合)...ほとんどの場合それらはに似た混乱を追加しgoto
ます。
あなたが以前にそれを見たことがない理由についての私の推測は、それが関数からの、、および初期のsのcontinue
一種のいとこであるということです。そして、後藤が有害であると考えられていることは誰もが知っているので、多くの開発者はおそらくそれを避ける傾向があります。goto
break
return
私にとっては、continue
気にしない値があるかもしれないループをクリーンアップしたいときに使用する傾向があります。を使用するcontinue
と、ネストされたループ内の「重要な」ロジックを囲まずに、これらの値をスキップできますif
。
foreach (var v in GetSomeValues())
{
if (ThisValueIsNotImportant(v)) continue;
//Do important stuff with the value.
}
これを「リターン」と考えてください。ただし、ループのコンテキストにのみ適用できます。一般的な例は、利用可能なすべての入力をループするステートマシンです。
while(!SomeQueue.Empty)
{
byte nextByte = SomeQueue.Dequeue();
switch State:
{
case A:
if(nextByte == Condition)
{
State = B;
}
else
{
State = ParseError;
}
continue;
case B:
//Test nextByte
State = C;
continue;
case C:
//Test nextByte
State = A;
continue;
case ParseError:
//Do something for this condition
State = A;
continue;
}
私はそれを使わないことによって何かを逃したことがありますか?
それは奇妙な質問のようです。おそらく、ループの次の反復を早期に開始する必要があるかどうかは、他の誰よりもよく知っています。
コードの最適化にもcontinueステートメントを使用できます。すべての条件のうち、多くても1つの条件が満たされることが確実な場合。以下のように使用できます、
foreach (var element in List)
{
if (condition1)
{
//do stuff .....
continue;
}
if (condition2)
{
//do stuff ....
continue;
}
.
.
.
if (condition)
{
//do stuff ....
continue;
}
}
ここで、Ifステートメントのいずれかの条件が満たされると、残りのすべてのifステートメントはスキップされます。