最近、私はオープンソースプロジェクトを経験しており、.NETで数年開発してきましたが、continue
キーワード。
質問:continue
キーワードを使用するメリットがあるベストプラクティスまたは領域は何ですか?以前に見たことがない理由はありますか?
これを使用して、現在のループ反復を直ちに終了し、該当する場合は次のループを開始します。
foreach (var obj in list)
{
continue;
var temp = ...; // this code will never execute
}
continue
は通常、条件に関連付けられており、その条件は通常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
と同様の混乱を招きます。 。
以前にそれを見たことがない理由についての私の推測は、continue
がgoto
、break
、および関数からの初期のreturn
sの従兄弟のようなものであるということです。 Gotoは有害と見なされます であることは誰もが知っているため、多くの開発者はおそらくそれを避けがちです。
私にとって、気にしていない値があるかもしれないループをクリーンアップしたいときは、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ステートメントはスキップされます。