フロー制御 (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 の使用は、オブジェクト指向プログラミングの適切な手法に反するので、できるだけ避けることをお勧めします。

参照

概念

C# プログラミング ガイド

その他の技術情報

Visual C#

Java 開発者のための C# プログラミング言語