i-school - switch 文

1.Switch文とは


 Switch文は、プログラミング言語において多岐にわたる条件分岐を実現するための制御文の一つです。
特に、ある変数の値によって、異なる処理を行いたい場合に便利です。

 if-else文でも同じようなことは可能ですが、条件が多くなると可読性が下がるため、そのような場合にはSwitch文を使用すると効果的です。

 色々な記法を知っておき、使いこなすスキルを身につけていくことで、プログラムの実装力が向上します。


2.Switch文の基本的な書き方


 Switch文の基本的な書き方は以下の通りです。


switch (変数) {
    case 値1:
        // 値1の時の処理
        break;
    case 値2:
        // 値2の時の処理
        break;
    default:
        // 上記以外の値の時の処理
        break;
}

 各キーワードの説明です。

 switch:switch文を始めます。これに続けて括弧()内に、分岐の元となる変数を書きます。

 case:変数が特定の値を持つ場合の処理を記述します。これに続けてコロン:を書き、その後に該当する値が変数に存在する場合の処理を記述します。

 break:それぞれのcaseブロックの最後にはbreakを書きます。これは、そのブロックの処理が終わったらswitch文から出るためのキーワードです。メソッド自体を終了したい場合には return でも抜け出せます。

 default:変数がどのcaseにも当てはまらない場合の処理を記述します。これはオプションで、必ずしも記述する必要はありません。



<サンプルコード>
string menu = "ハンバーガー";

switch (menu) {

    case "ハンバーガー":
        // ハンバーガーを作る処理
        break;

    case "フレンチフライ":
        // フレンチフライを作る処理
        break;

    case "シェイク":
        // シェイクを作る処理
        break;

    default:
        // それ以外のメニューの場合の処理
        break;
}

 case と break の間の改行は不要です。

 ただし、可読性を高めるためにも、最初の内は上記のように改行しておいた方が読みやすいでしょう。
 

3.Switch文とEnumの相性


 Enum(列挙型)とは、複数の定数を一つにまとめて名前をつけて管理するための型です。
Switch文とEnumは非常に相性が良く、Enumの値に応じて異なる処理を行いたい場合によく使用されます。

 例えば、ゲームのキャラクターの状態(立っている、走っている、ジャンプしているなど)をEnumで管理し、
その状態に応じて異なるアニメーションを再生する、といったことが可能です。


public enum CharacterState {
    Standing,
    Running,
    Jumping
}

CharacterState state = CharacterState.Running;

switch (state) {
    case CharacterState.Standing:
        // 立っている時の処理
        break;
    case CharacterState.Running:
        // 走っている時の処理
        break;
    case CharacterState.Jumping:
        // ジャンプしている時の処理
        break;
    default:
        break;
}

 このように、Switch文とEnumを組み合わせることでコードが読みやすくなり、状態に応じた処理を簡単に管理することができます。


4. Switch文と式木


 C# 8.0から、Switch文は特定の型や条件に一致するかどうかを判定できるようになりました。
パターンマッチングと呼ばれる機能の一環であり、これにより、Switch文はより柔軟な分岐処理を記述することが可能になりました。


object obj = "Hello, World!";

switch (obj)
{
    case string s:
        Console.WriteLine($"It's a string with length {s.Length}");
        break;
    case int i:
        Console.WriteLine($"It's an integer with value {i}");
        break;
    default:
        Console.WriteLine("It's something else.");
        break;
}

 この例では、objがstring型かint型か、それ以外の型かを判定しています。
case string s:の部分では、objがstring型であれば、その値をsという変数に代入し、その後の処理で使用できるようになっています。


5.Switch文を使ったメソッド内部の処理


 では、具体的なメソッドの中でSwitch文とEnumを使った例を見てみましょう。
以下は、キャラクターの状態に応じて異なるアニメーションを再生するメソッドの例です。


public enum CharacterState {
    Standing,
    Running,
    Jumping
}

public void PlayAnimation(CharacterState state) {
    switch (state) {
        case CharacterState.Standing:
            // 立っている時のアニメーションを再生
            Console.WriteLine("Standing animation");
            break;
        case CharacterState.Running:
            // 走っている時のアニメーションを再生
            Console.WriteLine("Running animation");
            break;
        case CharacterState.Jumping:
            // ジャンプしている時のアニメーションを再生
            Console.WriteLine("Jumping animation");
            break;
        default:
            // 予期しない状態
            Console.WriteLine("Invalid state");
            break;
    }
}

 このメソッドPlayAnimationでは、引数としてCharacterState型のstateを受け取り、そのstateの値に応じてSwitch文で分岐しています。
それぞれのcaseで、対応する状態のアニメーションを再生する処理(ここではConsole.WriteLineで代用)を記述します。


6.戻り値を持つSwitch文:式形式のSwitch文


 C# 8.0以降では、より簡潔にSwitch文を書くことが可能となりました。
特に、Switch式と呼ばれる形式では、戻り値を持つSwitch文を一行で書くことが可能です。
これにより、コードがよりシンプルになり、読みやすさが向上します。

 以下に、Switch式を使った例を示します。


public enum Size {
    Small,
    Medium,
    Large
}

public int GetSizeValue(Size size) {
    return size switch {
        Size.Small => 1,
        Size.Medium => 2,
        Size.Large => 3,
        _ => 0 // それ以外の値
    };
}

 このGetSizeValueメソッドでは、引数としてSize型のsizeを受け取り、それに対応する整数値を戻り値として返しています。
Switch式では、return文の後に変数 switchと書き、その後に{ }内で各caseを記述します。各caseでは、値 => 結果の形式を取ります。

 また、_はすべての値を表すワイルドカードで、ここではそれ以外の値に対するデフォルトの処理を記述します。


7.まとめ


 以上が、Switch文の基本的な使い方とその応用例です。

 条件分岐が多岐にわたる場合や、Enumと組み合わせて使用する場合などには、Switch文が非常に有効です。
また、Switch式を使うことで、より簡潔なコードを書くことができます。