C# での goto

Fil Zjazel Romaeus Villegas 2023年10月12日
C# での goto

このチュートリアルでは、C# で goto 構文を使用する方法を示し、コードでの実際の使用例をいくつか示します。

goto は、プログラムが検出されるとコードの新しい部分に自動的に移動するという無条件のジャンプステートメントです。goto を使用するには、ラベルでマークされたステートメントと、ラベルを呼び出すインスタンスの両方が必要です。

ラベルを作成するには、ラベルが呼び出されたときに実行するステートメントの前にコロンを付けて名前を追加します。

例:

using System;

namespace goto_Example1 {
  class Program {
    static void Main(string[] args) {
      int a = 1;
      goto print_a;

      a = 2;

    print_a:
      Console.WriteLine(a.ToString());

      Console.ReadLine();
    }
  }
}

この例では、整数変数 a を 1 に等しくなるように初期化します。すぐに goto を呼び出してステートメント print_a にジャンプするため、a が 2 に等しくなるように設定されることはありません。したがって、a の値をコンソールに出力すると、公開されるのは 2 ではなく 1 です。

出力:

1

C# で goto を使用する場合

ただし、goto は、完全に別のセクションにジャンプする必要がある場合、ロジックのフローが明確でないため、コードの可読性が低下すると批判されているため、現在はあまり一般的に使用されていません。

ただし、goto が有益で読みやすさを向上させる場合もあります。たとえば、ネストされたループや switch ステートメントをエスケープできます。

例:

using System;

namespace goto_Example2 {
  class Program {
    static void Main(string[] args) {
      // Intialize the integer variable a
      int a = 2;
      // Run the function test input
      TestInput(a);

      // Change the value of a and see how it affects the output from TestInput()
      a = 1;
      TestInput(a);

      a = 3;
      TestInput(a);

      Console.ReadLine();
    }

    static void TestInput(int input) {
      // In this example function, we only want to accept either 1 or 2 as values.
      // If we accept the value 1, we want to add to it and then run case 2;

      // Print the original value
      Console.WriteLine("Input Being Tested: " + input.ToString());

      switch (input) {
        case 1:
          input++;
        // If goto isn't called, the input value will not be modified, and its final value would
        // have been unchanged
        goto case 2;

            case 2:
          input = input / 2;
          break;

        default:
          break;
      }
      Console.WriteLine("Final Value: " + input.ToString() + "\n");
    }
  }
}

上記の例では、渡された値に応じてさまざまなことを行うサンプル関数を作成しました。3つのケースが検討されています。1つ目は、値が 1 に等しい場合です。この場合、入力値に追加してから、goto 関数を使用してケース 2 に進みます。goto が呼び出されなかった場合、入力値は変更されませんでした。

ケース 2 では、入力を 2 で除算します。最後に、渡された他の値はデフォルトのケースに該当し、まったく変更されません。最後に、最終値が出力され、ケース 1 と 2 が同じ絶対値になることを示しています。goto により、最初にケースの仕様を満たしていない場合でも、ステートメントにジャンプしてケースを適用できます。

出力:

Input Being Tested: 2
Final Value: 1

Input Being Tested: 1
Final Value: 1

Input Being Tested: 3
Final Value: 3

関連記事 - Csharp Statement