C# switch caseの使い方を初心者向けに解説|条件分岐の基本・書き方・よくあるエラーまでわかるガイド
はじめに
C#でプログラムを書くとき、条件によって処理を分けたい場面はとても多くあります。
たとえば、入力された数字によってメニューを切り替えたり、曜日によって表示するメッセージを変えたり、ユーザーの状態によって実行する処理を変えたりする場面です。
このような条件分岐では if 文がよく使われますが、特定の値に応じて処理を分けたい場合は switch case が便利です。
この記事では、C# switch case の基本的な使い方を初心者向けにわかりやすく解説します。基本構文、サンプルコード、if文との違い、よくあるエラー、switch式などの発展知識まで順番に説明していきます。
1. C#のswitch caseとは?条件分岐の基本を理解しよう
1-1. switch caseは「値によって処理を分ける」ための構文
C#の switch case は、ある値を確認し、その値に応じて実行する処理を分けるための構文です。
たとえば、変数 number の値が 1 なら「1です」、2 なら「2です」、それ以外なら「該当なし」と表示したい場合に使えます。
C#int number = 1;
switch (number)
{
case 1:
Console.WriteLine("1です");
break;
case 2:
Console.WriteLine("2です");
break;
default:
Console.WriteLine("該当なし");
break;
}
このように、switch の中に判定したい値を書き、case ごとに処理を分けます。
switch case は「この値だったらこの処理」という形で書けるため、複数の値を比較する条件分岐を見やすく整理できます。
1-2. if文との違い|switch caseが向いている場面
C#で条件分岐を書く方法として、代表的なのが if 文と switch case です。
if 文は、条件式を自由に書けるのが特徴です。
C#int score = 80;
if (score >= 90)
{
Console.WriteLine("優秀です");
}
else if (score >= 70)
{
Console.WriteLine("合格です");
}
else
{
Console.WriteLine("再挑戦です");
}
一方、switch case は、ひとつの値に対して複数の候補を比較する場合に向いています。
C#string color = "red";
switch (color)
{
case "red":
Console.WriteLine("赤です");
break;
case "blue":
Console.WriteLine("青です");
break;
case "green":
Console.WriteLine("緑です");
break;
default:
Console.WriteLine("その他の色です");
break;
}
if 文は「点数が70以上」「年齢が20歳未満」など、範囲や複雑な条件を扱うときに便利です。
switch case は「値が1か2か3か」「文字列がredかblueかgreenか」のように、決まった値の中から処理を分けるときに便利です。
1-3. 初心者がswitch caseを覚えるメリット
初心者がC#の switch case を覚えるメリットは大きく分けて3つあります。
1つ目は、複数の分岐を読みやすく書けることです。
if else if が何度も続くと、条件が増えるほどコードが長くなり、どの条件でどの処理が動くのか分かりにくくなることがあります。switch case を使うと、値ごとの処理を縦に整理できるため、見通しがよくなります。
2つ目は、メニュー処理や状態管理で使いやすいことです。
コンソールアプリで「1なら登録」「2なら一覧表示」「3なら終了」のようなメニューを作る場合、switch case はとても相性がよいです。
3つ目は、実務でもよく使われる基本構文であることです。
C#では、数値、文字列、enumなどを使った分岐処理がよく登場します。switch case を理解しておくと、他人が書いたコードも読みやすくなります。
2. C# switch caseの基本構文と書き方
2-1. switch文の基本形
C#の switch 文は、次のような形で書きます。
C#switch (判定する値)
{
case 値1:
// 値1だった場合の処理
break;
case 値2:
// 値2だった場合の処理
break;
default:
// どのcaseにも一致しなかった場合の処理
break;
}
switch の丸括弧の中には、判定したい変数や式を書きます。
case には、比較したい値を書きます。
default は、どの case にも一致しなかった場合に実行される処理です。
2-2. caseの書き方
case は、switch で指定した値と比較するために使います。
C#int number = 2;
switch (number)
{
case 1:
Console.WriteLine("numberは1です");
break;
case 2:
Console.WriteLine("numberは2です");
break;
case 3:
Console.WriteLine("numberは3です");
break;
}
このコードでは、number の値が 2 なので、次の処理が実行されます。
C#Console.WriteLine("numberは2です");
case の後ろにはコロン : を付けます。初心者のうちは、セミコロン ; と間違えないように注意しましょう。
正しい書き方は次の通りです。
C#case 1:
間違った書き方は次の通りです。
C#case 1;
2-3. breakの役割
break は、switch 文の処理を終了するために使います。
C#int number = 1;
switch (number)
{
case 1:
Console.WriteLine("1です");
break;
case 2:
Console.WriteLine("2です");
break;
}
case 1 の処理が実行されたあと、break によって switch 文から抜けます。
C#では、基本的に各 case の最後に break などのジャンプ文を書く必要があります。break を書かずに次の case に処理が流れるような書き方は、C#では多くの場合エラーになります。
C#int number = 1;
switch (number)
{
case 1:
Console.WriteLine("1です");
case 2:
Console.WriteLine("2です");
break;
}
このようなコードは、case 1 から case 2 にそのまま処理が流れてしまう可能性があるため、C#ではエラーになります。
正しくは次のように書きます。
C#int number = 1;
switch (number)
{
case 1:
Console.WriteLine("1です");
break;
case 2:
Console.WriteLine("2です");
break;
}
2-4. defaultの役割
default は、どの case にも一致しなかった場合に実行される処理です。
C#int number = 5;
switch (number)
{
case 1:
Console.WriteLine("1です");
break;
case 2:
Console.WriteLine("2です");
break;
default:
Console.WriteLine("1でも2でもありません");
break;
}
このコードでは、number は 5 です。
case 1 にも case 2 にも一致しないため、default の処理が実行されます。
default は必ず書かなければならないわけではありません。しかし、想定外の値が入った場合の処理を書いておくと、プログラムの動作が分かりやすくなります。
2-5. switch caseの処理の流れ
switch case の処理の流れは次の通りです。
まず、switch の丸括弧の中にある値を確認します。
次に、その値と一致する case を上から探します。
一致する case が見つかると、その中の処理を実行します。
処理の途中で break が実行されると、switch 文を抜けます。
どの case にも一致しなかった場合は、default があれば default の処理を実行します。
C#string fruit = "apple";
switch (fruit)
{
case "orange":
Console.WriteLine("オレンジです");
break;
case "apple":
Console.WriteLine("りんごです");
break;
default:
Console.WriteLine("不明な果物です");
break;
}
この場合、fruit の値は "apple" なので、case "apple" の処理が実行されます。
3. C# switch caseの基本サンプルコード
3-1. 数値で分岐するswitch caseの例
まずは、数値を使った基本的な例です。
C#int menu = 1;
switch (menu)
{
case 1:
Console.WriteLine("登録処理を実行します");
break;
case 2:
Console.WriteLine("一覧表示を実行します");
break;
case 3:
Console.WriteLine("終了します");
break;
default:
Console.WriteLine("正しいメニュー番号を入力してください");
break;
}
このコードでは、menu の値によって実行する処理を分けています。
menu が 1 の場合は登録処理、2 の場合は一覧表示、3 の場合は終了処理を行います。
数値による分岐は、メニュー番号やステータス番号などを扱うときによく使われます。
3-2. 文字列で分岐するswitch caseの例
C#の switch case では、文字列も使えます。
C#string command = "start";
switch (command)
{
case "start":
Console.WriteLine("処理を開始します");
break;
case "stop":
Console.WriteLine("処理を停止します");
break;
case "restart":
Console.WriteLine("処理を再起動します");
break;
default:
Console.WriteLine("不明なコマンドです");
break;
}
このコードでは、command の値が "start" なので、次のメッセージが表示されます。
C#処理を開始します
文字列の比較では、大文字と小文字が区別されます。
たとえば、"start" と "Start" は別の文字列として扱われます。
C#string command = "Start";
switch (command)
{
case "start":
Console.WriteLine("開始します");
break;
default:
Console.WriteLine("一致しません");
break;
}
この場合、command は "Start" なので、case "start" には一致しません。
大文字小文字を区別したくない場合は、あらかじめ小文字に変換してから判定する方法があります。
C#string command = "Start";
switch (command.ToLower())
{
case "start":
Console.WriteLine("開始します");
break;
case "stop":
Console.WriteLine("停止します");
break;
default:
Console.WriteLine("不明なコマンドです");
break;
}
3-3. enumを使ったswitch caseの例
enum は、決まった値の一覧を名前付きで定義できる機能です。
switch case と enum は相性がよく、状態や種類によって処理を分けるときによく使われます。
C#enum OrderStatus
{
Pending,
Shipped,
Delivered,
Cancelled
}
この enum を使って、注文状態ごとに処理を分けてみます。
C#OrderStatus status = OrderStatus.Shipped;
switch (status)
{
case OrderStatus.Pending:
Console.WriteLine("注文は処理待ちです");
break;
case OrderStatus.Shipped:
Console.WriteLine("商品は発送済みです");
break;
case OrderStatus.Delivered:
Console.WriteLine("商品は配達済みです");
break;
case OrderStatus.Cancelled:
Console.WriteLine("注文はキャンセルされています");
break;
default:
Console.WriteLine("不明な注文状態です");
break;
}
enum を使うと、1 や 2 のような数値だけで状態を表すよりも、コードの意味が分かりやすくなります。
C#OrderStatus.Shipped
このように書かれていれば、「発送済みの状態」を表していることがすぐに分かります。
3-4. defaultに一致しない場合の処理を書く例
default は、想定外の値に対応するために便利です。
C#int day = 8;
switch (day)
{
case 1:
Console.WriteLine("月曜日です");
break;
case 2:
Console.WriteLine("火曜日です");
break;
case 3:
Console.WriteLine("水曜日です");
break;
case 4:
Console.WriteLine("木曜日です");
break;
case 5:
Console.WriteLine("金曜日です");
break;
case 6:
Console.WriteLine("土曜日です");
break;
case 7:
Console.WriteLine("日曜日です");
break;
default:
Console.WriteLine("1から7までの数字を入力してください");
break;
}
この例では、day に 8 が入っています。
曜日として有効なのは 1 から 7 までなので、default の処理が実行されます。
default を書いておくことで、想定外の入力があったときにも適切なメッセージを表示できます。
4. switch caseでよく使う実践的な書き方
4-1. 複数のcaseで同じ処理を実行する書き方
複数の case で同じ処理を実行したい場合は、case を続けて書くことができます。
C#int day = 6;
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
Console.WriteLine("平日です");
break;
case 6:
case 7:
Console.WriteLine("休日です");
break;
default:
Console.WriteLine("1から7までの数字を入力してください");
break;
}
このコードでは、day が 1 から 5 の場合は「平日です」、6 または 7 の場合は「休日です」と表示します。
C#では、処理を書かずに case を連続させる書き方はよく使われます。
ただし、処理を書いたあとに break なしで次の case に進む書き方は基本的にできません。
4-2. case内で変数を使うときの注意点
case の中で変数を宣言するときは、スコープに注意が必要です。
次のようなコードはエラーになることがあります。
C#int number = 1;
switch (number)
{
case 1:
string message = "1です";
Console.WriteLine(message);
break;
case 2:
string message = "2です";
Console.WriteLine(message);
break;
}
case 1 と case 2 の中で同じ名前の message を宣言しているため、エラーになります。
このような場合は、case ごとに波括弧 { } を使ってスコープを分けると安全です。
C#int number = 1;
switch (number)
{
case 1:
{
string message = "1です";
Console.WriteLine(message);
break;
}
case 2:
{
string message = "2です";
Console.WriteLine(message);
break;
}
}
初心者のうちは、case 内で変数を宣言する場合は { } で囲む習慣をつけるとよいでしょう。
4-3. break以外でswitchを抜ける方法
switch case では、break 以外にも処理を抜ける方法があります。
代表的なものは return と throw です。
return は、メソッド自体を終了するときに使います。
C#static string GetMessage(int number)
{
switch (number)
{
case 1:
return "1です";
case 2:
return "2です";
default:
return "不明な値です";
}
}
この例では、各 case で return しているため、break は不要です。
throw は、例外を発生させるときに使います。
C#static string GetDayName(int day)
{
switch (day)
{
case 1:
return "月曜日";
case 2:
return "火曜日";
case 3:
return "水曜日";
default:
throw new ArgumentException("1から3までの値を指定してください");
}
}
このように、break 以外でも、switch の処理がそこで終わることが明確であれば問題ありません。
4-4. 入力値チェックでswitch caseを使う例
switch case は、ユーザーの入力値をチェックする場面でも使えます。
C#Console.WriteLine("コマンドを入力してください");
Console.WriteLine("start: 開始");
Console.WriteLine("stop : 停止");
Console.WriteLine("exit : 終了");
string input = Console.ReadLine();
switch (input)
{
case "start":
Console.WriteLine("開始します");
break;
case "stop":
Console.WriteLine("停止します");
break;
case "exit":
Console.WriteLine("終了します");
break;
default:
Console.WriteLine("正しいコマンドを入力してください");
break;
}
この例では、ユーザーが入力した文字列に応じて処理を分けています。
ただし、Console.ReadLine() は null を返す可能性もあります。より安全に書くなら、次のようにします。
C#string input = Console.ReadLine() ?? "";
switch (input.ToLower())
{
case "start":
Console.WriteLine("開始します");
break;
case "stop":
Console.WriteLine("停止します");
break;
case "exit":
Console.WriteLine("終了します");
break;
default:
Console.WriteLine("正しいコマンドを入力してください");
break;
}
?? "" は、入力が null だった場合に空文字として扱うための書き方です。
4-5. メニュー処理でswitch caseを使う例
コンソールアプリでは、メニュー処理で switch case がよく使われます。
C#Console.WriteLine("メニューを選択してください");
Console.WriteLine("1: ユーザー登録");
Console.WriteLine("2: ユーザー一覧");
Console.WriteLine("3: 終了");
string input = Console.ReadLine();
switch (input)
{
case "1":
Console.WriteLine("ユーザー登録を行います");
break;
case "2":
Console.WriteLine("ユーザー一覧を表示します");
break;
case "3":
Console.WriteLine("アプリケーションを終了します");
break;
default:
Console.WriteLine("1から3の番号を入力してください");
break;
}
このようなメニュー処理では、入力された値が決まった選択肢のどれに当てはまるかを判定するため、switch case がとても使いやすいです。
数値として扱いたい場合は、int.TryParse を使って入力値を数値に変換します。
C#Console.WriteLine("メニューを選択してください");
Console.WriteLine("1: 登録");
Console.WriteLine("2: 表示");
Console.WriteLine("3: 終了");
string input = Console.ReadLine();
if (int.TryParse(input, out int menu))
{
switch (menu)
{
case 1:
Console.WriteLine("登録します");
break;
case 2:
Console.WriteLine("表示します");
break;
case 3:
Console.WriteLine("終了します");
break;
default:
Console.WriteLine("1から3の番号を入力してください");
break;
}
}
else
{
Console.WriteLine("数字を入力してください");
}
int.TryParse を使うことで、数字以外が入力された場合にもエラーを防げます。
5. if文とswitch caseの使い分け
5-1. 条件が少ない場合はif文が向いている
条件が1つか2つ程度であれば、if 文の方がシンプルに書けます。
C#int age = 20;
if (age >= 20)
{
Console.WriteLine("成人です");
}
else
{
Console.WriteLine("未成年です");
}
このような単純な条件では、無理に switch case を使う必要はありません。
switch case は、複数の値を比較するときに力を発揮します。
5-2. 分岐が多い場合はswitch caseが向いている
同じ変数に対して複数の値を比較する場合は、switch case が向いています。
if 文で書くと次のようになります。
C#int menu = 2;
if (menu == 1)
{
Console.WriteLine("登録");
}
else if (menu == 2)
{
Console.WriteLine("表示");
}
else if (menu == 3)
{
Console.WriteLine("削除");
}
else if (menu == 4)
{
Console.WriteLine("終了");
}
else
{
Console.WriteLine("不正な値です");
}
同じ内容を switch case で書くと、次のようになります。
C#int menu = 2;
switch (menu)
{
case 1:
Console.WriteLine("登録");
break;
case 2:
Console.WriteLine("表示");
break;
case 3:
Console.WriteLine("削除");
break;
case 4:
Console.WriteLine("終了");
break;
default:
Console.WriteLine("不正な値です");
break;
}
switch case の方が、「menuの値ごとに処理を分けている」という意図が分かりやすくなります。
5-3. 範囲条件や複雑な条件にはif文が向いている
範囲条件や複雑な条件を扱う場合は、if 文が向いています。
C#int score = 85;
if (score >= 90)
{
Console.WriteLine("A評価");
}
else if (score >= 80)
{
Console.WriteLine("B評価");
}
else if (score >= 70)
{
Console.WriteLine("C評価");
}
else
{
Console.WriteLine("D評価");
}
このように、「90以上」「80以上」「70以上」のような範囲を判定する場合は、if 文の方が自然です。
また、複数の条件を組み合わせる場合も if 文が分かりやすいです。
C#int age = 25;
bool hasTicket = true;
if (age >= 18 && hasTicket)
{
Console.WriteLine("入場できます");
}
else
{
Console.WriteLine("入場できません");
}
switch case でも発展的な書き方を使えば複雑な条件を書けますが、初心者のうちは無理に使わず、if 文と使い分けるのがおすすめです。
5-4. 読みやすいコードにするための使い分けの考え方
if 文と switch case の使い分けで大切なのは、どちらを使うと読みやすいかを考えることです。
条件が少ない場合や、範囲を判定する場合は if 文が向いています。
ひとつの値に対して、複数の決まった値を比較する場合は switch case が向いています。
たとえば、次のように考えると分かりやすいです。
C#// 年齢が20歳以上かどうか
if (age >= 20)
{
Console.WriteLine("成人です");
}
この場合は if 文が自然です。
C#// メニュー番号によって処理を分ける
switch (menu)
{
case 1:
Console.WriteLine("登録");
break;
case 2:
Console.WriteLine("表示");
break;
case 3:
Console.WriteLine("終了");
break;
}
この場合は switch case が自然です。
コードは自分だけでなく、他の人が読むこともあります。あとから見返したときに分かりやすいかどうかを意識して使い分けましょう。
6. C# switch caseで初心者がよくつまずくエラーと対処法
6-1. breakを書き忘れてエラーになる
C#の switch case で初心者がよくつまずくのが、break の書き忘れです。
C#int number = 1;
switch (number)
{
case 1:
Console.WriteLine("1です");
case 2:
Console.WriteLine("2です");
break;
}
このコードでは、case 1 の最後に break がありません。
C#では、処理がある case から次の case へそのまま流れる書き方は基本的にできないため、コンパイルエラーになります。
正しくは次のように書きます。
C#int number = 1;
switch (number)
{
case 1:
Console.WriteLine("1です");
break;
case 2:
Console.WriteLine("2です");
break;
}
ただし、return でメソッドを終了する場合などは break は不要です。
C#static string GetText(int number)
{
switch (number)
{
case 1:
return "1です";
case 2:
return "2です";
default:
return "不明です";
}
}
6-2. caseに指定できない値を書いてしまう
通常の case には、定数として扱える値を書く必要があります。
たとえば、次のように変数を case に直接書くとエラーになります。
C#int number = 1;
int target = 1;
switch (number)
{
case target:
Console.WriteLine("一致しました");
break;
}
target は変数なので、通常の case ラベルとしては使えません。
このような場合は、if 文を使う方が自然です。
C#int number = 1;
int target = 1;
if (number == target)
{
Console.WriteLine("一致しました");
}
または、case に固定の値を書きます。
C#int number = 1;
switch (number)
{
case 1:
Console.WriteLine("1です");
break;
}
6-3. 同じcaseラベルを複数書いてしまう
同じ case ラベルを複数書くとエラーになります。
C#int number = 1;
switch (number)
{
case 1:
Console.WriteLine("最初の1です");
break;
case 1:
Console.WriteLine("2つ目の1です");
break;
}
case 1 が2回出てきているため、どちらを実行すればよいか分からなくなります。
同じ値に対する処理は1か所にまとめましょう。
C#int number = 1;
switch (number)
{
case 1:
Console.WriteLine("1です");
break;
case 2:
Console.WriteLine("2です");
break;
}
複数の値で同じ処理をしたい場合は、次のように case を並べます。
C#int number = 2;
switch (number)
{
case 1:
case 2:
case 3:
Console.WriteLine("1から3のどれかです");
break;
default:
Console.WriteLine("それ以外です");
break;
}
6-4. case内で同じ名前の変数を宣言してエラーになる
case の中で同じ名前の変数を宣言すると、エラーになることがあります。
C#int number = 1;
switch (number)
{
case 1:
string text = "1です";
Console.WriteLine(text);
break;
case 2:
string text = "2です";
Console.WriteLine(text);
break;
}
case 1 と case 2 の両方で text という変数を宣言しているため、エラーになります。
対処法は、case ごとに { } を付けてスコープを分けることです。
C#int number = 1;
switch (number)
{
case 1:
{
string text = "1です";
Console.WriteLine(text);
break;
}
case 2:
{
string text = "2です";
Console.WriteLine(text);
break;
}
}
これで、それぞれの text は別のスコープ内の変数として扱われます。
6-5. defaultを書かないとどうなるのか
default は必須ではありません。
そのため、次のようなコードも書けます。
C#int number = 3;
switch (number)
{
case 1:
Console.WriteLine("1です");
break;
case 2:
Console.WriteLine("2です");
break;
}
この場合、number は 3 ですが、case 1 にも case 2 にも一致しません。
default もないため、何も実行されずに switch 文を抜けます。
これはエラーではありませんが、初心者のうちは「なぜ何も表示されないのか」と迷いやすいポイントです。
想定外の値を確認したい場合は、できるだけ default を書いておきましょう。
C#int number = 3;
switch (number)
{
case 1:
Console.WriteLine("1です");
break;
case 2:
Console.WriteLine("2です");
break;
default:
Console.WriteLine("1でも2でもありません");
break;
}
6-6. switch caseが思った通りに動かないときの確認ポイント
switch case が思った通りに動かないときは、次の点を確認しましょう。
まず、switch に指定している変数の値が本当に想定通りか確認します。
C#Console.WriteLine(input);
のように、判定前に値を表示してみると原因を見つけやすくなります。
次に、文字列の大文字小文字が一致しているか確認します。
C#string command = "Start";
switch (command)
{
case "start":
Console.WriteLine("開始");
break;
default:
Console.WriteLine("一致しません");
break;
}
この場合、"Start" と "start" は別の文字列なので一致しません。
また、余分な空白が入っていないかも確認しましょう。
C#string input = "start ";
switch (input)
{
case "start":
Console.WriteLine("開始");
break;
default:
Console.WriteLine("一致しません");
break;
}
"start " には末尾に空白があるため、"start" とは一致しません。
このような場合は、Trim() を使って前後の空白を取り除けます。
C#string input = "start ";
switch (input.Trim())
{
case "start":
Console.WriteLine("開始");
break;
default:
Console.WriteLine("一致しません");
break;
}
入力値を扱うときは、ToLower() や Trim() を使って比較しやすい形に整えることも大切です。
7. C#のswitch caseをより便利に使う発展知識
7-1. C#のswitch式とは
C#には、通常の switch 文とは別に switch式 という書き方があります。
switch式 は、値に応じて結果を返すときに便利です。
通常の switch 文で書くと、次のようになります。
C#static string GetDayName(int day)
{
switch (day)
{
case 1:
return "月曜日";
case 2:
return "火曜日";
case 3:
return "水曜日";
default:
return "不明";
}
}
これを switch式 で書くと、次のようになります。
C#static string GetDayName(int day)
{
return day switch
{
1 => "月曜日",
2 => "火曜日",
3 => "水曜日",
_ => "不明"
};
}
switch式 では、case や break を使いません。
代わりに、=> を使って「この値ならこの結果」と書きます。
最後の _ は、通常の switch 文における default のような役割です。
7-2. switch文とswitch式の違い
switch文 と switch式 の大きな違いは、処理を書くのか、値を返すのかです。
switch文 は、条件に応じて複数行の処理を実行したいときに向いています。
C#int menu = 1;
switch (menu)
{
case 1:
Console.WriteLine("登録処理を開始します");
Console.WriteLine("入力画面を表示します");
break;
case 2:
Console.WriteLine("一覧を表示します");
break;
default:
Console.WriteLine("不正なメニューです");
break;
}
一方、switch式 は、条件に応じて値を返したいときに向いています。
C#int rank = 2;
string rankName = rank switch
{
1 => "ゴールド",
2 => "シルバー",
3 => "ブロンズ",
_ => "ランクなし"
};
Console.WriteLine(rankName);
初心者のうちは、まず通常の switch文 をしっかり理解し、その後で switch式 を学ぶとスムーズです。
7-3. パターンマッチングを使った分岐
C#の switch では、値の一致だけでなく、型や条件に応じた分岐もできます。
これをパターンマッチングと呼びます。
C#object value = "Hello";
switch (value)
{
case int number:
Console.WriteLine($"整数です: {number}");
break;
case string text:
Console.WriteLine($"文字列です: {text}");
break;
case null:
Console.WriteLine("nullです");
break;
default:
Console.WriteLine("その他の型です");
break;
}
この例では、value の実際の型によって処理を分けています。
value が int なら整数として処理し、string なら文字列として処理します。
通常の case 1: や case "start": よりも発展的な書き方ですが、C#ではよく使われる便利な機能です。
7-4. whenを使った条件付きcase
when を使うと、case に追加の条件を付けられます。
C#int score = 85;
switch (score)
{
case int n when n >= 90:
Console.WriteLine("A評価");
break;
case int n when n >= 80:
Console.WriteLine("B評価");
break;
case int n when n >= 70:
Console.WriteLine("C評価");
break;
default:
Console.WriteLine("D評価");
break;
}
このコードでは、score の値に応じて評価を分けています。
ただし、このような範囲条件は if 文でも分かりやすく書けます。
C#if (score >= 90)
{
Console.WriteLine("A評価");
}
else if (score >= 80)
{
Console.WriteLine("B評価");
}
else if (score >= 70)
{
Console.WriteLine("C評価");
}
else
{
Console.WriteLine("D評価");
}
when は便利ですが、初心者のうちはまず基本の switch case と if 文を使い分けられるようになることが大切です。
7-5. 初心者はまず通常のswitch文から覚えるべき理由
C#には、通常の switch文、switch式、パターンマッチング、when など、さまざまな書き方があります。
しかし、初心者が最初からすべてを覚えようとすると混乱しやすくなります。
まずは、次の基本形を確実に理解しましょう。
C#switch (value)
{
case 1:
// 処理
break;
case 2:
// 処理
break;
default:
// どれにも一致しない場合
break;
}
この形を理解しておけば、数値、文字列、enumを使った基本的な条件分岐が書けるようになります。
その後で、必要に応じて switch式 やパターンマッチングを学べば十分です。
8. C# switch caseを書くときのベストプラクティス
8-1. defaultをできるだけ書く
default は必須ではありませんが、できるだけ書くことをおすすめします。
C#switch (menu)
{
case 1:
Console.WriteLine("登録");
break;
case 2:
Console.WriteLine("表示");
break;
default:
Console.WriteLine("不正なメニューです");
break;
}
default を書いておくと、想定外の値が入ったときの動作が明確になります。
特に、ユーザー入力や外部データを扱う場合は、予想しない値が入る可能性があります。
そのような場合に default があると、エラーを防いだり、原因を見つけやすくしたりできます。
8-2. caseが多すぎる場合は設計を見直す
switch case は便利ですが、case が多くなりすぎると読みにくくなります。
C#switch (type)
{
case 1:
// 処理
break;
case 2:
// 処理
break;
case 3:
// 処理
break;
case 4:
// 処理
break;
case 5:
// 処理
break;
case 6:
// 処理
break;
}
分岐が少ないうちは問題ありませんが、数十個の case が並ぶようになると、修正や確認が大変になります。
その場合は、設計を見直すことも考えましょう。
たとえば、処理をメソッドに分けたり、クラスに分けたり、辞書を使って対応関係を管理したりする方法があります。
C#var actions = new Dictionary<int, Action>
{
{ 1, () => Console.WriteLine("登録") },
{ 2, () => Console.WriteLine("表示") },
{ 3, () => Console.WriteLine("削除") }
};
int menu = 1;
if (actions.TryGetValue(menu, out Action action))
{
action();
}
else
{
Console.WriteLine("不正なメニューです");
}
初心者のうちは無理に難しい設計にする必要はありませんが、case が多すぎるときは「もっと分かりやすくできないか」と考える習慣を持つとよいです。
8-3. 処理が長い場合はメソッドに分ける
case の中に長い処理を書くと、switch 全体が読みにくくなります。
C#switch (menu)
{
case 1:
Console.WriteLine("入力チェック");
Console.WriteLine("データ登録");
Console.WriteLine("完了メッセージ表示");
break;
case 2:
Console.WriteLine("データ取得");
Console.WriteLine("一覧表示");
break;
}
このような場合は、処理をメソッドに分けると読みやすくなります。
C#switch (menu)
{
case 1:
RegisterUser();
break;
case 2:
ShowUsers();
break;
default:
Console.WriteLine("不正なメニューです");
break;
}
static void RegisterUser()
{
Console.WriteLine("入力チェック");
Console.WriteLine("データ登録");
Console.WriteLine("完了メッセージ表示");
}
static void ShowUsers()
{
Console.WriteLine("データ取得");
Console.WriteLine("一覧表示");
}
switch case の中では「何をするのか」だけを分かりやすく書き、細かい処理はメソッドに分けると保守しやすくなります。
8-4. 読みやすいインデントと命名を意識する
switch case は、インデントが崩れると一気に読みにくくなります。
読みやすいコードにするためには、次のように整えて書きましょう。
C#switch (status)
{
case OrderStatus.Pending:
Console.WriteLine("処理待ちです");
break;
case OrderStatus.Shipped:
Console.WriteLine("発送済みです");
break;
case OrderStatus.Delivered:
Console.WriteLine("配達済みです");
break;
default:
Console.WriteLine("不明な状態です");
break;
}
また、変数名やenum名も分かりやすくすることが大切です。
C#int x = 1;
よりも、次のように書いた方が意味が伝わります。
C#int menuNumber = 1;
コードは動けばよいだけではありません。あとから読んだときに、何をしているのか分かることも重要です。
8-5. コメントを書きすぎずコードで意図を伝える
初心者のうちは、コメントを書いて説明したくなることがあります。
もちろん、必要なコメントは大切です。
しかし、コメントを書きすぎると、かえって読みにくくなることもあります。
C#// menuが1の場合
case 1:
// 登録処理を実行
Console.WriteLine("登録");
break;
この程度であれば、コメントがなくてもコードを見れば意味が分かります。
次のように、変数名やメソッド名で意図を伝える方が自然です。
C#switch (menuNumber)
{
case 1:
RegisterUser();
break;
case 2:
ShowUserList();
break;
default:
ShowInvalidMenuMessage();
break;
}
コメントは、「なぜそうしているのか」を補足するために使うと効果的です。
「何をしているのか」は、できるだけコードそのもので伝えるようにしましょう。
9. C# switch caseに関するよくある質問
9-1. C#のswitch caseで文字列は使える?
はい、C#の switch case では文字列を使えます。
C#string command = "save";
switch (command)
{
case "save":
Console.WriteLine("保存します");
break;
case "load":
Console.WriteLine("読み込みます");
break;
default:
Console.WriteLine("不明なコマンドです");
break;
}
ただし、文字列は大文字と小文字が区別されます。
"save" と "Save" は別の値として扱われます。
大文字小文字を区別したくない場合は、ToLower() などを使って比較前に変換するとよいでしょう。
C#switch (command.ToLower())
{
case "save":
Console.WriteLine("保存します");
break;
}
9-2. C#のswitch caseで複数条件は書ける?
はい、複数の case で同じ処理を実行することはできます。
C#int number = 2;
switch (number)
{
case 1:
case 2:
case 3:
Console.WriteLine("1から3のどれかです");
break;
default:
Console.WriteLine("それ以外です");
break;
}
また、発展的な書き方として when を使うことで条件を追加することもできます。
C#int score = 85;
switch (score)
{
case int n when n >= 80:
Console.WriteLine("80点以上です");
break;
default:
Console.WriteLine("80点未満です");
break;
}
ただし、複雑な条件が増える場合は if 文の方が読みやすいこともあります。
9-3. C#のswitch caseでbreakは必ず必要?
通常の switch case では、多くの場合 break が必要です。
C#switch (number)
{
case 1:
Console.WriteLine("1です");
break;
case 2:
Console.WriteLine("2です");
break;
}
ただし、return や throw で処理が終了する場合は、break は不要です。
C#static string GetMessage(int number)
{
switch (number)
{
case 1:
return "1です";
case 2:
return "2です";
default:
return "不明です";
}
}
つまり、各 case の処理がどこで終わるのかを明確にする必要があります。
初心者のうちは、通常の switch 文では break を書くと覚えておくと安心です。
9-4. defaultは必ず書くべき?
default は文法上必須ではありません。
しかし、できるだけ書くことをおすすめします。
C#switch (menu)
{
case 1:
Console.WriteLine("登録");
break;
case 2:
Console.WriteLine("表示");
break;
default:
Console.WriteLine("不正なメニューです");
break;
}
default を書いておくと、想定外の値が入ったときにも処理できます。
特に、ユーザー入力を扱う場合は、想定していない値が入力される可能性があるため、default があると安全です。
9-5. switch caseとswitch式はどちらを使えばよい?
処理を実行したい場合は、通常の switch case が向いています。
C#switch (menu)
{
case 1:
RegisterUser();
break;
case 2:
ShowUsers();
break;
default:
ShowError();
break;
}
値を返したい場合は、switch式 が向いています。
C#string message = menu switch
{
1 => "登録",
2 => "表示",
3 => "終了",
_ => "不正なメニュー"
};
初心者は、まず通常の switch case を覚えるのがおすすめです。
通常の switch case が理解できると、switch式 も理解しやすくなります。
まとめ
C#の switch case は、値によって処理を分けるための便利な条件分岐構文です。
数値、文字列、enumなどを使って、複数の分岐を分かりやすく整理できます。
基本形は次の通りです。
C#switch (値)
{
case 値1:
// 処理
break;
case 値2:
// 処理
break;
default:
// どれにも一致しない場合の処理
break;
}
case には比較したい値を書き、処理の最後には基本的に break を書きます。
どの case にも一致しなかった場合の処理として、default を書いておくと安全です。
if 文との使い分けも重要です。
条件が少ない場合や範囲条件を扱う場合は if 文が向いています。
一方で、ひとつの値に対して複数の候補を比較する場合は switch case が向いています。
また、初心者がつまずきやすいポイントとして、break の書き忘れ、同じ case ラベルの重複、case 内での変数名の重複、文字列の大文字小文字や空白の違いなどがあります。
C# switch caseを正しく使えるようになると、条件分岐のコードを読みやすく整理できます。まずは基本の switch 文をしっかり覚え、慣れてきたら switch式 やパターンマッチングなどの発展的な書き方にも挑戦してみましょう。

