web-dev-qa-db-ja.com

C#で 'continue'キーワードを使用する場合

最近、私はオープンソースプロジェクトを経験しており、.NETで数年開発してきましたが、continueキーワード。

質問:continueキーワードを使用するメリットがあるベストプラクティスまたは領域は何ですか?以前に見たことがない理由はありますか?

33
Rion Williams

これを使用して、現在のループ反復を直ちに終了し、該当する場合は次のループを開始します。

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を使用すると、コードが読みやすくなる場合があります。もちろん、ループと条件文を適切なメソッドにリファクタリングすると、ループが読みやすくなります。

43
Anthony Pegram

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
15

深い入れ子を防ぎます。

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を使用すると、コードが読みやすくなる場合があります。明らかに、他のすべての言語構成要素と同様に、慎重に使用する必要があります。

12
Konrad Morawski

ループから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();
}
11
Joe

慎重に使用してください。

最良の(=読みやすい)ループはbreakcontinueを使用せず、構造化されたgotoステートメントの一種です。

そうは言っても、1つまたは2つのbreak/continueステートメントでループが読めなくなることはありませんが、それらの使用法を明確にし、シンプルに保つことは価値があります。

8
Henk Holterman

基本的にcontinuebreakの方が優れています(ただし、多くの場合偽装されています)gotoステートメント...

ループの内側にいて、ループの内側に来るすべてのものがスキップされ、次の反復を続ける必要があることがわかっている場合は常に、continue...を使用できます。

そのため、めったに使用すべきではありません...場合によっては、コードが非常に読みやすく明確になることがあります(たとえば、いくつかのレベルのネストがある場合)...ほとんどの場合、gotoと同様の混乱を招きます。 。

7
Yahia

以前にそれを見たことがない理由についての私の推測は、continuegotobreak、および関数からの初期のreturnsの従兄弟のようなものであるということです。 Gotoは有害と見なされます であることは誰もが知っているため、多くの開発者はおそらくそれを避けがちです。

私にとって、気にしていない値があるかもしれないループをクリーンアップしたいときは、continueを使用する傾向があります。 continueを使用するネストされたifのループで「重要な」ロジックを囲まなくても、これらの値をスキップできます。

foreach (var v in GetSomeValues())
{
  if (ThisValueIsNotImportant(v)) continue;

  //Do important stuff with the value.
}
5
wageoghe

それを使わないことで何かを逃したことがありますか?

それは奇妙な質問のようです。おそらく、ループの次の反復を早期に開始する必要があるかどうかは、誰よりも優れています。

3
recursive

これは「リターン」と考えることができますが、ループのコンテキストにのみ適用できます。一般的な例は、利用可能なすべての入力をループするステートマシンです。

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;
}
3
whatsisname

コードの最適化にもcontinueステートメントを使用できます。すべての条件のうち、1つの条件が満たされると確信している場合。以下のように使用できます

foreach (var element in List)
{
    if (condition1)
    {
        //do stuff .....
        continue;
    }
    if (condition2)
    {
        //do stuff ....
        continue;
    }
    .
    .
    .
    if (condition)
    {
        //do stuff ....
        continue;
    }
}

ここで、Ifステートメントの条件のいずれかが満たされた場合、残りのすべてのifステートメントはスキップされます。

0
Sushant Yelpale