【C#】if文とswitch文、どっちを使うべき?可読性を上げる使い分けの基準

【C#】if文とswitch文、どっちを使うべき?

はじめに

C#を学び始めて基本文法を理解した頃、ふと疑問に思うことがあります。

「この条件分岐、if文とswitch文どっちで書くべき?」

どちらを使っても同じ結果が得られる場面は多いですが、可読性や保守性を考えると、適材適所で使い分けることが重要です。本記事では、実務でも役立つ明確な判断基準を解説します。

if文の特徴と得意なケース

if文の基本的な特徴

if文は、任意の条件式(bool型を返す式)を評価できる柔軟な条件分岐です。

if (score >= 80)
{
    Console.WriteLine("優秀");
}
else if (score >= 60)
{
    Console.WriteLine("合格");
}
else
{
    Console.WriteLine("不合格");
}

if文が適しているケース

1. 範囲や大小比較を行う場合

// 範囲判定はif文が自然
if (temperature < 0)
{
    status = "氷点下";
}
else if (temperature < 25)
{
    status = "快適";
}
else
{
    status = "暑い";
}

2. 複数の異なる条件を組み合わせる場合

// 複合条件はif文の得意分野
if (user.IsActive && user.Age >= 18 && user.HasPermission)
{
    AllowAccess();
}

3. 条件が2〜3個程度の単純な分岐

// シンプルな分岐ならif文で十分
if (isLoggedIn)
{
    ShowDashboard();
}
else
{
    ShowLoginPage();
}

switch文の特徴と得意なケース

switch文の基本的な特徴

switch文は、1つの値に対して複数の定数値との一致を判定する条件分岐です。

switch (dayOfWeek)
{
    case DayOfWeek.Saturday:
    case DayOfWeek.Sunday:
        Console.WriteLine("休日");
        break;
    default:
        Console.WriteLine("平日");
        break;
}

switch文が適しているケース

1. 列挙型(enum)の値で分岐する場合

// enumとswitch文は相性抜群
switch (orderStatus)
{
    case OrderStatus.Pending:
        return "注文受付中";
    case OrderStatus.Processing:
        return "処理中";
    case OrderStatus.Shipped:
        return "発送済み";
    case OrderStatus.Delivered:
        return "配達完了";
    default:
        return "不明";
}

2. 特定の定数値との一致判定が4つ以上ある場合

// 分岐が多い場合、switch文の方が見通しが良い
switch (httpStatusCode)
{
    case 200:
        return "OK";
    case 201:
        return "Created";
    case 400:
        return "Bad Request";
    case 401:
        return "Unauthorized";
    case 404:
        return "Not Found";
    case 500:
        return "Internal Server Error";
    default:
        return "Unknown";
}

3. 文字列の完全一致で分岐する場合

switch (command.ToLower())
{
    case "start":
        StartProcess();
        break;
    case "stop":
        StopProcess();
        break;
    case "restart":
        RestartProcess();
        break;
    default:
        ShowHelp();
        break;
}

使い分けの判断基準まとめ

迷ったときは、以下の基準で判断してください。

判断ポイントif文を選ぶswitch文を選ぶ
比較の種類範囲・大小・複合条件単一値との一致
分岐の数2〜3個4個以上
対象の型任意整数型、文字列、enum
条件の関係性条件同士が独立している1つの変数に対する分岐

判断フローチャート

  1. 範囲比較や複合条件か?if文
  2. 1つの値の一致判定か? → 次へ
  3. 分岐が4つ以上あるか?switch文
  4. enumの値か?switch文
  5. 上記以外if文(シンプルな方を選ぶ)

【C# 8.0以降】switch式で更にスッキリ書く

C# 8.0で導入されたswitch式(switch expression)を使うと、より簡潔に書けます。

従来のswitch文

string GetGrade(int score)
{
    switch (score / 10)
    {
        case 10:
        case 9:
            return "A";
        case 8:
            return "B";
        case 7:
            return "C";
        default:
            return "D";
    }
}

switch式(C# 8.0以降)

string GetGrade(int score) => (score / 10) switch
{
    10 or 9 => "A",
    8 => "B",
    7 => "C",
    _ => "D"
};

switch式は値を返す式として使えるため、メソッドの戻り値や変数への代入がスッキリ書けます。

パフォーマンスの違いはあるのか?

「switch文の方が速い」という話を聞いたことがあるかもしれません。

結論から言えば、現代のC#コンパイラは高度に最適化されているため、通常のアプリケーション開発でパフォーマンス差を気にする必要はほとんどありません

コンパイラは状況に応じて、switch文をジャンプテーブルに最適化したり、if-else連鎖に変換したりします。つまり、可読性と保守性を優先して選ぶべきです。

パフォーマンスが本当に重要な場面(1秒間に何百万回も呼ばれるようなホットパス)では、実際にベンチマークを取って判断してください。

よくある間違いと注意点

1. switch文でbreakを忘れない

C#では、各caseの末尾にbreak(またはreturnthrowなど)が必須です。

// コンパイルエラーになる
switch (value)
{
    case 1:
        DoSomething();
        // break忘れ → エラー
    case 2:
        DoOther();
        break;
}

2. switch文のdefaultは書く習慣をつける

想定外の値が来た場合の処理を明示することで、バグの早期発見につながります。

switch (status)
{
    case Status.Active:
        // 処理
        break;
    case Status.Inactive:
        // 処理
        break;
    default:
        throw new ArgumentOutOfRangeException(nameof(status));
}

まとめ

if文とswitch文の使い分けは、以下のポイントを押さえておけば迷いません。

  • 範囲比較・複合条件 → if文
  • 単一値の一致判定が多い → switch文
  • enumの分岐 → switch文
  • C# 8.0以降なら → switch式も検討

最も大切なのは、「このコードを半年後の自分や他の開発者が読んだとき、意図が伝わるか?」という視点です。可読性を意識した選択を心がけましょう。