web-dev-qa-db-ja.com

returnを使用してループを終了しますか?

For、do、またはwhileループを記述した場合、returnキーワードを使用してこれから抜け出すことはできますか?

例えば:

class BreakTest 
{
public static void Main() 
{
  for (int i = 1; i <= 100; i++) 
  {
     if (i == 5) 
        **return;**
     Console.WriteLine(i);
    }
   }
}

Ifステートメントを終了するためにreturnを使用できることを知っているので、これを試したことがない(そしてこれをテストするためのコードを作成するためにソフトウェアにアクセスできない)ので、これに興味があります。

21
GurdeepS

returnは現在のメソッド(例ではMain)を終了します。ループを終了するには、breakを使用します。

50
CesarGon

あなたは確かにあなたが求めていることを行うことができます。あなたがするべきかどうかについては2つのキャンプがあるようです。関数からの出口点は1つだけであるべきだと言う人もいます。フラグ変数を使用して終了する必要があること(および場合によっては返す必要のあるデータ)を記録し、ループから抜け出した場合、またはif/elseツリーの終わりに達した場合に戻ることを提案しています。

個人的には、関数からの複数の出口点が対称である限り、問題はありません。 「対称」とはどういう意味ですか?さて、ループの内側から戻る場合は、ループの最後にも戻りたいと思います(ループの中で、最初に戻るような状態に達したことがない場合に備えて)。複雑なif/else階層内にいて、いずれかのケース内から戻る場合は、すべてのケース内から戻る必要があります。

以下に、コードの記述方法の簡単な例をいくつか示します。

    public string Search(IEnumerable<string> values)
    {
        foreach(string value in values)
        {
            if(SomeArbitraryCondition())
                return value;
        }

        return null;
    }

    public int PerformAction()
    {
        if (SomeArbitraryCondition())
        {
            if (SomeArbitraryCondition())
            {
                return 1;
            }
            else
            {
                return 2;
            }
        }
        else
        {
            if (SomeArbitraryCondition())
            {
                return 3;
            }
            else
            {
                return 4;
            }
        }
    }

これは、私が多くのことを考えてきた、実際に難しい規則ではありませんが、私にとって最もクリーンなように思えるため、私が書くことを好む方法です。場合によっては、フラグ変数を使用して1つの場所に戻るだけの方が理にかなっています。

    public string Search(IEnumerable<string> values)
    {
        string found = null;
        foreach(string value in values)
        {
            if(SomeArbitraryCondition())
                found = value;
        }

        return found;
    }

    public int PerformAction()
    {
        int state;
        if (SomeArbitraryCondition())
        {
            if (SomeArbitraryCondition())
            {
                state = 1;
            }
            else
            {
                state = 2;
            }
        }
        else
        {
            if (SomeArbitraryCondition())
            {
                state = 3;
            }
            else
            {
                state = 4;
            }
        }

        return state;
    }

あなたはcanこれを行います。 return;を呼び出すと、Main()が終了します。通常、代わりにbreak;を使用してforループから抜け出します。

とはいえ、1つの関数内に複数の戻り位置を含めることは、多くの場合悪い習慣と見なされています。多くの開発者は、単一のreturnステートメントを使用することを好みます(メソッドがvoidで宣言されていない場合)。これにより、理解しやすさの観点からコードの追跡が容易になり、保守とテストが容易になります。

3
Reed Copsey

これらを覚えておいてください:

  1. これは実行できますが、現在の実行方法から自動的に終了するため、お勧めできません。
  2. 条件に関係なく、ループの後の他のステートメントが必須である場合は有用ではありません(最初のポイントで述べられている動作のため)。
  3. プログラムに波及効果をもたらす可能性があります。つまり、1つのエラー/バグ/障害を解決しようとすると、多くの新しいものが発生します。これにより、デバッグが少し複雑になります。
1
mudrak patel

期限切れの回答ですがreturn;は、戻り値の型がvoidの場合、メソッド全体(ループからも抜けます)を終了します。そうでない場合は、メソッドのタイプを返さない限り、コンパイルされません。

0