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文は、次のように書きます。
// 曜日番号から日本語の曜日名を表示する例
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を書かなければ、次のようにコンパイルエラーになります。
// コンパイルエラーになる例
switch (day)
{
case 1:
Console.WriteLine("月曜日");
// breakがないのでエラー
case 2:
Console.WriteLine("火曜日");
break;
}
C言語などのswitchでは「フォールスルー(下のcaseへそのまま流れる)」が可能ですが、C#では明示的にフォールスルーはできないという仕様になっています。
このおかげで、うっかりbreakを書き忘れるバグを防げます。
複数条件を1つのcaseで扱う方法
同じ処理を複数の値に適用する

同じ処理をしたいcaseが複数ある場合、caseラベルを連続して並べることで対応できます。
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行で複数条件を書くこともできます。
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)もそのまま判定に使うことができます。
メニューコマンドなどの分岐に便利です。
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()で事前に統一しておきます。
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式の基本形
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式では、>=などの比較演算を直接パターンとして書けます。
int temp = 32;
string message = temp switch
{
<= 0 => "氷点下です",
<= 15 => "肌寒いです",
<= 25 => "過ごしやすいです",
_ => "暑いです"
};
Console.WriteLine(message);
過ごしやすいです
従来ならif-else ifで書いていたようなコードを、switch式1つでスッキリ書けることが分かります。
orパターンで複数条件をまとめる
先ほどの「複数条件」の節で触れたように、orを使って複数の値をまとめられます。
switch式との組み合わせ例を示します。
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(または_)をできるだけ書いておくことが重要です。
特に、以下のような目的があります。
- 予期せぬ値が来たときに、エラーメッセージを出す
- ログに記録して、バグや仕様変更に早く気付けるようにする
たとえば、次のように「想定外の値が来たら例外を投げる」というパターンもよく使われます。
string GetDayName(int day) =>
day switch
{
1 => "月",
2 => "火",
3 => "水",
4 => "木",
5 => "金",
6 => "土",
7 => "日",
_ => throw new ArgumentOutOfRangeException(nameof(day), "1〜7で指定してください")
};
設計上絶対に来ないはずの値であっても、最後に保険をかけておくのがおすすめです。
複雑になったらメソッドに切り出す
switchの中が長くなりすぎる場合は、各caseの処理をメソッドに分離すると読みやすくなります。
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#コードを書いていってください。
