35

continue最近、私はオープンソースプロジェクトを経験していて、.NETで数年間開発してきましたが、これまでキーワードに出くわしたことはありませんでした。

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

4

10 に答える 10

54

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

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
    }
}

continueifループ内に複数のレベルのネストされたロジックがある場合は、より魅力的になります。ネストするcontinue代わりに、コードを読みやすくすることができます。もちろん、ループと条件を適切なメソッドにリファクタリングすると、ループが読みやすくなります。

于 2011-11-01T21:27:29.143 に答える
17

キーワードは、ループブロックの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
于 2011-11-01T21:27:44.567 に答える
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コードの可読性が向上する可能性があります。明らかに、他のすべての言語構成と同様に、考慮して使用する必要があります。

于 2011-11-01T21:29:48.030 に答える
11

ループから抜けたくない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();
}
于 2011-11-01T21:26:48.447 に答える
8

慎重に使用する必要があります。

最良の(=読みやすい)ループはbreakまたはcontinueを使用しません。これらは一種の構造化されたgotoステートメントです。

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

于 2011-11-01T21:28:08.533 に答える
7

基本的continueに、breakより良い(しかししばしば偽装された)gotoステートメント...

ループ内にいて、ループ内で次に来るすべてのものをスキップして、使用できる次の反復を続行する必要があることを知っているときはいつでもcontinue...

そのため、それらはめったに使用されるべきではありません...時々それらはコードを非常に読みやすく明確にします(例えば、代替がいくつかのレベルのネストである場合)...ほとんどの場合それらはに似た混乱を追加しgotoます。

于 2011-11-01T21:30:28.210 に答える
6

あなたが以前にそれを見たことがない理由についての私の推測は、それが関数からの、、および初期のsのcontinue一種のいとこであるということです。そして、後藤が有害であると考えられていることは誰もが知っているので、多くの開発者はおそらくそれを避ける傾向があります。gotobreakreturn

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

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

  //Do important stuff with the value.
}
于 2011-11-01T21:31:42.623 に答える
3

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

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;
}
于 2011-11-01T21:32:44.490 に答える
3

私はそれを使わないことによって何かを逃したことがありますか?

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

于 2011-11-01T21:29:43.387 に答える
0

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

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

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

于 2017-09-07T17:47:41.370 に答える