フロー制御 (C# と Java の比較)
更新 : 2007 年 11 月
if else ステートメントや switch ステートメントなどのフロー制御ステートメントは、Java と C# で基本的に同じです。
分岐ステートメント
分岐ステートメントは、実行時に一定の条件に従ってプログラムの実行フローを変更します。
if、else、および else if
これらのステートメントは両方の言語で同じです。
switch ステートメント
switch ステートメントは、両方の言語で条件付きの複数分岐処理を実現します。ただし、Java では、case の最後で break ステートメントを使用している場合を除き、1 つの case から "落下 (フォール スルー)" して、次の case を実行できるという点が異なります。C# では、break または goto のいずれかのステートメントを各 case の最後で使用する必要があり、いずれも存在しない場合は、次のコンパイル エラーが発生します。
コントロールは 1 つの case ラベルから別のラベルへ落下できません。
case に一致したときに、その case で実行するコードを指定していない場合は、その次の case に制御が落下します。switch ステートメントで goto を使用しているときは、同じ switch 内の別の case ブロックだけにジャンプできます。既定の case にジャンプする場合は、goto default. を使用します。それ以外の場合は、goto case cond を使用します。ここでの cond は、ジャンプ先の case の一致条件です。また、Java の switch との違いとして、Java では、整数型でしか切り替えることができないのに対し、C# では、文字列変数で切り替えることができるという点もあります。
たとえば、次のコードは C# では有効ですが、Java では無効です。
static void Main(string[] args)
{
switch (args[0])
{
case "copy":
//...
break;
case "move":
//...
goto case "delete";
case "del":
case "remove":
case "delete":
//...
break;
default:
//...
break;
}
}
goto の復帰
Java の場合、goto は予約済みのキーワードで実装されません。ただし、ラベル付きステートメントを break または continue と共に使用することで、goto と同じ目的を達成できます。
C# では、goto ステートメントでラベル付きステートメントにジャンプできます。ただし、特定のラベルにジャンプするには、goto ステートメントがそのラベルのスコープ内に存在する必要があります。言い換えると、goto は、ステートメント ブロックから外にジャンプすることはできますが、ステートメント ブロックの中にはジャンプできません。また、クラスからジャンプすることも、try...catch ステートメント内の finally ブロックから出ることもできません。goto の使用は、オブジェクト指向プログラミングの適切な手法に反するので、できるだけ避けることをお勧めします。