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