C# gotoの使い方や書き方

## gotoとは
gotoとは、今処理している場所から他の場所を処理するように、処理をジャンプするものです。
gotoは以下の場合などに使います。
– switchで指定したcaseに処理を移動する時
– 深い階層から抜け出す時
## gotoの使い方や書き方

goto ラベル名;
ラベル名:;
goto ラベル名;

gotoキーワードのあとに、処理を移動したいラベル名を書きます。
これにより、goto ラベル名;が実行された時に、指定したラベル名へ処理が移動します。

ラベル名:;

処理を移動したい場所に、好きなラベル名を書き、そのあとに「 : 」(コロン)を書きます。
これにより、goto ラベル名;が実行された時に、ラベル名:;へ処理が移動します。

using static System.Console;
class TestClass { static void Main() { int a = 0; for (a = 0; a < 10; a++) { if (a == 5) { goto idou; } } idou: WriteLine("イチゴが" + a + "個"); } }
イチゴが5個

1. if (a == 5)で、aが5になった時点でgoto idou;が実行されます。
2. goto idou;が実行されると、idou:へ処理が移動します。
3. idou:へ処理が移動したため、そのあとのWriteLine(“イチゴが” + a + “個”);が実行されます。
4. aが5になった時点でforを抜け出したので、WriteLine(“イチゴが” + a + “個”);の実行結果がイチゴが5個になります。
## gotoとラベルは同じメソッド内に書かないとエラーになる

using static System.Console;
class TestClass { static void Main() { string kago1 = "イチゴ"; string kago2 = "モモ";
if (kago1 == "イチゴ") { WriteLine("イチゴです。"); goto idou; } if (kago2 == "ミカン") { idou: WriteLine("ミカンです。"); } } }
// gotoの範囲内に「idou」というラベルはありません
Error CS0159: No such label 'idou' within the scope of the goto statement
// このラベルは参照されていません
Warning CS0164: This label has not been referenced

1. goto idou;idou:は別々のif文の中に指定しているため、gotoの範囲内に「idou」というラベルはありませんというエラーとこのラベルは参照されていませんという警告が表示されます。
## gotoをswitchで使う
gotoのラベルは、switchのcaseやdefaultに指定することができます。

switch (式)
{
    case 定数1:
        // 処理
        goto default;
    case 定数2:
        // 処理
        goto case 定数名;
    default:
        // 処理
        break;
}
goto case 定数名;

指定した「 case 定数名 」へ実行する処理が移動し、「 case 定数名 」の処理が実行されます。

goto default;

default:へ実行する処理が移動し、「 default 」の処理が実行されます。

### switchのcaseに移動

using static System.Console;
class TestClass { static void Main() { string kago = "イチゴ"; switch (kago) { case "果物": WriteLine("果物です。"); break; case "イチゴ": WriteLine("イチゴです。"); goto case "果物"; } } }
イチゴです。
果物です。
1. goto case “果物”;が実行されると、case “果物”:へ実行する処理が移動します。
2. case “果物”:内の処理のWriteLine(“果物です。”);
break;
が実行されます。

### switchのdefaultに移動

using static System.Console;
class TestClass { static void Main() { string kago = "イチゴ"; switch (kago) { case "イチゴ": WriteLine("イチゴです。"); goto default; default: WriteLine("果物です。"); break; } } }
イチゴです。
果物です。
1. goto default;が実行されると、default:へ実行する処理が移動します。
2. default:内の処理のWriteLine(“果物です。”);
break;
が実行されます。

## gotoでforの深い階層から抜け出す
以下の例では、ネストしたforからgotoを使って抜け出しています。

using static System.Console;
class TestClass { static void Main() { int a = 0, b = 0; for (a = 0; a < 10; a++) { for (b = 0; b < 10; b++) { if (b == 5) { goto erabu; } } } erabu: WriteLine("イチゴが" + a + b + "個"); } }
イチゴが05個

1. if (b == 5)でbの値が5になるとif文のブロック内のgoto erabu;が実行されます。
2. goto erabu;が実行されると、実行する処理がerabu:へ移動し、ネストされたforから抜け出します。
3. erabu:のあとから処理が再開します。
4. WriteLine(“イチゴが” + a + b + “個”);が実行され、「 イチゴが05個 」と表示されます。