閉じる

【C#】switch文の使い方入門|複数条件・文字列・パターンマッチ

C#のswitch文は、分岐処理を読みやすく整理するための強力な構文です。

本記事では、基本構文から複数条件、文字列、パターンマッチング、C# 8以降の新しい書き方までを、丁寧な図解とサンプルコード付きで解説します。

if文が増えて読みにくくなってきたと感じたら、switch文の出番です。

C#のswitch文とは

switch文の役割と特徴

C#のswitch文は、1つの式(値)を評価して、その結果に応じて複数の分岐から1つを選ぶ構文です。

if文を大量に並べる代わりに、switch文を使うことで、次のようなメリットがあります。

  • 条件が「ある1つの値」に対する分岐のとき、コードが読みやすくなる
  • caseごとに処理がはっきり分かれるため、見落としが減る
  • 定数や列挙型(enum)との相性が良く、メンテナンス性が高い

特に、整数・列挙型・文字列など、明確な候補が限られている場合に威力を発揮します。

switch文とif文の使い分け

if文の方が向いているのは、次のようなケースです。

  • 比較演算(>, <, >=, <= など)を含む複雑な条件
  • 複数の変数を組み合わせる条件
  • 範囲で条件を判定することが中心になる場合

一方で、「1つの値に対して、候補が決まっている・増えにくい」場合はswitch文を使うと、ロジックが一目で把握しやすくなります。

基本的なswitch文の書き方

基本構文と各キーワードの意味

C#の基本的なswitch文は、次のように書きます。

C#
// 曜日番号から日本語の曜日名を表示する例
using System;

class Program
{
    static void Main()
    {
        int day = 3; // 例: 3は水曜日

        switch (day) // 判定したい値を書く
        {
            case 1:
                Console.WriteLine("月曜日");
                break; // ここでswitch文を抜ける

            case 2:
                Console.WriteLine("火曜日");
                break;

            case 3:
                Console.WriteLine("水曜日");
                break;

            case 4:
                Console.WriteLine("木曜日");
                break;

            case 5:
                Console.WriteLine("金曜日");
                break;

            default:
                // 上記のどのcaseにも当てはまらない場合
                Console.WriteLine("土日または不正な値です");
                break;
        }
    }
}
実行結果
水曜日

各要素の意味は次のとおりです。

  • switch (式)
    判定対象となる式(値)です。整数、列挙型、文字列などを指定できます。
  • case 値:
    式の結果がこの値と等しい場合に実行されるラベルです。
  • break;
    実行が終わったらswitchブロックから抜けるための命令です。
  • default:
    どのcaseにも一致しなかった場合に実行されます。省略も可能ですが、予期せぬ値に対応するために書いておくことを強く推奨します。

breakを書かないとどうなるのか

C#のswitch文では、原則としてcaseの末尾にbreakを書く必要があります

もしbreakを書かなければ、次のようにコンパイルエラーになります。

C#
// コンパイルエラーになる例
switch (day)
{
    case 1:
        Console.WriteLine("月曜日");
        // breakがないのでエラー
    case 2:
        Console.WriteLine("火曜日");
        break;
}

C言語などのswitchでは「フォールスルー(下のcaseへそのまま流れる)」が可能ですが、C#では明示的にフォールスルーはできないという仕様になっています。

このおかげで、うっかりbreakを書き忘れるバグを防げます。

複数条件を1つのcaseで扱う方法

同じ処理を複数の値に適用する

同じ処理をしたいcaseが複数ある場合、caseラベルを連続して並べることで対応できます。

C#
using System;

class Program
{
    static void Main()
    {
        int day = 6; // 1〜5: 平日, 6〜7: 休日

        switch (day)
        {
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
                // 上のどのcaseでもここに到達します
                Console.WriteLine("平日です");
                break;

            case 6:
            case 7:
                Console.WriteLine("休日です");
                break;

            default:
                Console.WriteLine("不正な日付です");
                break;
        }
    }
}
実行結果
休日です

このようにすることで、複数の条件を1つの処理にまとめて記述できます。

C#では、case 1:の直後に処理を書かず、そのまま次のcase 2:へ「フォールスルーさせる」形で、明示的に複数条件をまとめるのが一般的です。

C# 9以降の「パターン」のorで複数条件を書く

C# 9以降では、パターンマッチングのorを使って、1行で複数条件を書くこともできます。

C#
using System;

class Program
{
    static void Main()
    {
        int day = 2;

        switch (day)
        {
            case 1 or 2 or 3 or 4 or 5:
                Console.WriteLine("平日です");
                break;

            case 6 or 7:
                Console.WriteLine("休日です");
                break;

            default:
                Console.WriteLine("不正な日付です");
                break;
        }
    }
}

この書き方はパターンマッチング構文の一種であり、後述する「switch式」と組み合わせると非常に読みやすいコードになります。

文字列とswitch文

文字列を判定する基本例

C#のswitch文は、文字列(string)もそのまま判定に使うことができます

メニューコマンドなどの分岐に便利です。

C#
using System;

class Program
{
    static void Main()
    {
        Console.Write("コマンドを入力してください(add/list/exit): ");
        string command = Console.ReadLine(); // ユーザー入力を取得

        switch (command)
        {
            case "add":
                Console.WriteLine("追加処理を実行します");
                break;

            case "list":
                Console.WriteLine("一覧を表示します");
                break;

            case "exit":
                Console.WriteLine("終了します");
                break;

            default:
                Console.WriteLine("未知のコマンドです");
                break;
        }
    }
}
実行結果
コマンドを入力してください(add/list/exit): list
一覧を表示します

このように、比較対象が文字列であっても、整数のときと同じ書き方で使えます。

大文字・小文字を区別したくない場合

C#の文字列比較は、デフォルトでは大文字・小文字を区別します。

そのため、上の例では"List""LIST"と入力するとdefault側に行ってしまいます。

大文字・小文字を区別せずに判定したい場合は、ToLower()ToUpper()で事前に統一しておきます。

C#
switch (command.ToLower()) // すべて小文字化してから判定
{
    case "add":
        Console.WriteLine("追加処理を実行します");
        break;

    case "list":
        Console.WriteLine("一覧を表示します");
        break;

    case "exit":
        Console.WriteLine("終了します");
        break;

    default:
        Console.WriteLine("未知のコマンドです");
        break;
}

入力のゆらぎを吸収したいときは、switchに渡す前に前処理をするという発想がポイントです。

C# 8以降のパターンマッチングとswitch式

従来のswitch文との違い

C# 8以降では、switch文が大きく進化し、パターンマッチングswitch式が使えるようになりました。

  • 従来のswitch文: 命令を並べる「文(statement)」
  • 新しいswitch式: 値を返す「式(expression)」

switch式を使うと、条件に応じて値を返す処理を、短く分かりやすく書けます。

switch式の基本形

C#
using System;

class Program
{
    static void Main()
    {
        int score = 78;

        // scoreに応じて成績ランクを返すswitch式
        string grade = score switch
        {
            >= 90 => "A",
            >= 80 => "B",
            >= 70 => "C",
            >= 60 => "D",
            _     => "F" // どれにも当てはまらない場合
        };

        Console.WriteLine($"成績: {grade}");
    }
}
実行結果
成績: C

ここでのポイントは次のとおりです。

  • score switch のあとに{ ... }でパターンと結果を並べる
  • パターン => 戻り値 の形式で記述する
  • _ は「どれにも当てはまらない場合」を表すワイルドカードです

switch式は、必ず何らかのパターンにマッチして値を返す必要があります。

そのため、最後に_ => ...を書くのが基本です。

パターンマッチングの代表的な例

比較パターン(関係パターン)

switch式では、>=などの比較演算を直接パターンとして書けます。

C#
int temp = 32;

string message = temp switch
{
    <= 0  => "氷点下です",
    <= 15 => "肌寒いです",
    <= 25 => "過ごしやすいです",
    _     => "暑いです"
};

Console.WriteLine(message);
実行結果
過ごしやすいです

従来ならif-else ifで書いていたようなコードを、switch式1つでスッキリ書けることが分かります。

orパターンで複数条件をまとめる

先ほどの「複数条件」の節で触れたように、orを使って複数の値をまとめられます。

switch式との組み合わせ例を示します。

C#
string dayType = DateTime.Now.DayOfWeek switch
{
    DayOfWeek.Monday or DayOfWeek.Tuesday or DayOfWeek.Wednesday
        or DayOfWeek.Thursday or DayOfWeek.Friday
        => "平日",

    DayOfWeek.Saturday or DayOfWeek.Sunday
        => "休日",

    _ => "不明"
};

Console.WriteLine(dayType);

列挙型(enum)とパターンマッチングの組み合わせは、非常に読みやすく保守しやすい書き方になります。

switch文でよくある注意点とベストプラクティス

defaultを必ず意識する

switch文やswitch式では、default(または_)をできるだけ書いておくことが重要です。

特に、以下のような目的があります。

  • 予期せぬ値が来たときに、エラーメッセージを出す
  • ログに記録して、バグや仕様変更に早く気付けるようにする

たとえば、次のように「想定外の値が来たら例外を投げる」というパターンもよく使われます。

C#
string GetDayName(int day) =>
    day switch
    {
        1 => "月",
        2 => "火",
        3 => "水",
        4 => "木",
        5 => "金",
        6 => "土",
        7 => "日",
        _ => throw new ArgumentOutOfRangeException(nameof(day), "1〜7で指定してください")
    };

設計上絶対に来ないはずの値であっても、最後に保険をかけておくのがおすすめです。

複雑になったらメソッドに切り出す

switchの中が長くなりすぎる場合は、各caseの処理をメソッドに分離すると読みやすくなります。

C#
switch (command.ToLower())
{
    case "add":
        ExecuteAdd();
        break;

    case "list":
        ExecuteList();
        break;

    case "exit":
        ExecuteExit();
        break;

    default:
        ShowUnknownCommand(command);
        break;
}

このようにすることで、switch文は「どのケースがあるのか」を示すインデックスのような役割になり、全体の構造が分かりやすくなります。

ifとswitchのバランスを考える

switch文は便利ですが、どんな条件でもswitchにすればよいわけではありません

条件が複数の変数にまたがる場合や、論理演算子(&&||)を多用する場合は、素直にif文を使った方が理解しやすいことも多いです。

「1つの値に対して、候補がいくつかあるだけ」ならswitch、それ以外はif、という意識で使い分けるとよいでしょう。

まとめ

本記事では、C#のswitch文について、基本構文から複数条件、文字列の判定、C# 8以降のパターンマッチングとswitch式まで解説しました。

1つの値に対して複数の候補から分岐するとき、switch文を使うとコードが格段に読みやすくなります

さらに、switch式や比較パターン、orパターンを活用すれば、if文の連鎖をコンパクトに書き換えることもできます。

日常的な分岐処理で少しずつswitchを取り入れて、より見通しの良いC#コードを書いていってください。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!