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を使用できることを知っているので、これを試したことがない(そしてこれをテストするためのコードを作成するためにソフトウェアにアクセスできない)ので、これに興味があります。
return
は現在のメソッド(例ではMain)を終了します。ループを終了するには、break
を使用します。
あなたは確かにあなたが求めていることを行うことができます。あなたがするべきかどうかについては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
で宣言されていない場合)。これにより、理解しやすさの観点からコードの追跡が容易になり、保守とテストが容易になります。
これらを覚えておいてください:
期限切れの回答ですがreturn;
は、戻り値の型がvoidの場合、メソッド全体(ループからも抜けます)を終了します。そうでない場合は、メソッドのタイプを返さない限り、コンパイルされません。