C# の switch とは? switch の使い方や解説入門

C# の switch とは? switch の使い方や解説入門

はじめに

C#の switch 文は、ある値に応じて実行する処理を切り替える際に非常に便利な制御構造です。

if 文でも同様の処理を実現できますが、switch 文は複数の条件分岐をより簡潔に記述できるため、コードの見やすさや保守性を向上させることができます。

switch 文の基本的な書き方

int number = 3;
switch (number)
{
    case 1:
        Console.WriteLine("数値は1です");
        break;
    case 2:
        Console.WriteLine("数値は2です");
        break;
    default:
        Console.WriteLine("数値は1でも2でもありません");
        break;
}

// 出力:"数値は1でも2でもありません"
  • switch(number): 判定する値を指定します。
  • case 1, case 2: 判定する値と一致した場合に実行する処理を記述します。
  • break: 処理を終了し、switch文から抜け出します。
  • default: どのcaseにも一致しなかった場合に実行する処理を記述します。

動作の解説:

上のコードでは、変数 number の値が3であるため、どのcaseにも一致せず、default の処理が実行され、「数値は1でも2でもありません」と表示されます。

switch 文の判定の対象となるデータ型は、整数型、文字列型、enum 型などが一般的です。

以下は switch 文の判定対象が文字列型のサンプルコードです。

// 文字列型
string fruit = "apple";
switch (fruit)
{
    case "apple":
        Console.WriteLine("りんごです");
        break;
    case "banana":
        Console.WriteLine("バナナです");
        break;
    default:
        Console.WriteLine("他の果物です");
        break;
}

// 出力:"りんごです"

switch 文の応用

enum 型との組み合わせ

enum 型は、定数を列挙するための型です。switch 文と組み合わせることで、より可読性が高く、保守性の高いコードを書くことができます。

enum Direction {
    Up,
    Down,
    Left,
    Right
}

Direction direction = Direction.Right;

switch (direction) {
    case Direction.Up:
        Console.WriteLine("上に移動");
        break;
    case Direction.Down:
        Console.WriteLine("下に移動");
        break;
    case Direction.Left:
        Console.WriteLine("左に移動");
        break;
    case Direction.Right:
        Console.WriteLine("右に移動");
        break;
}

メリット:

  • 可読性の向上: 定数名を直接使用するため、コードの意味が分かりやすくなります。
  • 誤りの防止: 定義されていない値を誤って代入することを防ぎます。
  • 拡張性: 新しい定数を追加する際に、switch 文の修正範囲が限定されます。

switch 式

C# 8.0で導入された新しい記法で、より簡潔で読みやすいコードを実現します。

int dayOfWeek = 3;
string dayName = dayOfWeek switch
{
    1 => "月曜日",
    2 => "火曜日",
    3 => "水曜日",
    4 => "木曜日",
    5 => "金曜日",
    6 => "土曜日",
    7 => "日曜日",
    _ => "無効な曜日"
};
Console.WriteLine(dayName);
// 出力:"水曜日"

メリット:

  • break文が不要
  • 代入と同時に処理が可能
  • コードがよりコンパクトに

パターンマッチング

C# 8.0以降、switch 文はパターンマッチングに対応しました。

パターンマッチングでは、変数の型や値だけでなく、オブジェクトの状態を基に、より複雑な条件分岐を行うことができます。

object obj = "Hello, World!";
string result = obj switch
{
    int x when x > 0 => $"正の整数: {x}",
    int x when x < 0 => $"負の整数: {x}",
    int x => $"ゼロ: {x}",
    string s => $"文字列(長さ: {s.Length}): {s}",
    bool b => $"真偽値: {b}",
    null => "nullオブジェクト",
    _ => "その他の型"
};
Console.WriteLine(result);

このコードの出力結果は:

文字列(長さ: 13): Hello, World!

となります。

objは文字列 “Hello, World!” なので、string sのパターンにマッチし、文字列の長さ(13文字)と元の文字列を含む出力が生成されます。

まとめ

switch 文は、ある値に応じて実行する処理を切り替える際に非常に便利な制御構造です。enum 型やパターンマッチングと組み合わせることで、より柔軟かつ強力な制御構造になります。

  • enum 型: 定数を列挙し、コードの可読性と保守性を向上させる。
  • パターンマッチング: より複雑な条件分岐を実現し、型安全性を高める。

これらの機能を効果的に活用することで、より洗練されたC#コードを作成することができます。

参考