C# switch caseの使い方完全ガイド|基本構文・複数条件・if文との違いを初心者向けに解説
はじめに
C#で条件分岐を書くとき、まず思い浮かぶのはif文かもしれません。しかし、条件の数が増えてくると、ifやelse ifが何行も続き、コードが読みにくくなることがあります。
そのような場面で便利なのが、switch caseです。
C#のswitch caseを使うと、「値がAならこの処理」「値がBならこの処理」「それ以外ならこの処理」という分岐を、整理された形で書けます。
この記事では、C#のswitch caseの基本構文、caseの使い方、複数条件の書き方、if文との違い、switch式との使い分けまで、初心者にもわかりやすく解説します。
1. C#のswitch caseとは?初心者向けに役割をわかりやすく解説
1-1. switch文は条件分岐を見やすく書くための構文
C#のswitch文は、ある値に応じて処理を分岐させるための構文です。
たとえば、ユーザーが選んだメニュー番号によって処理を変えたい場合や、ステータスごとに表示メッセージを変えたい場合に使います。
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なら「終了します」と表示されます。
1-2. caseは条件ごとの処理を指定するキーワード
caseは、switchで指定した値と比較する条件を表すキーワードです。
C#case 1:
Console.WriteLine("メニュー1です");
break;
この場合、switchに渡された値が1だったときに、このcaseの中の処理が実行されます。
つまり、caseは「この値だった場合は、この処理をする」という分岐先を指定する役割を持っています。
1-3. if文よりswitch caseが向いている場面
switch caseは、1つの値に対して複数の候補を比較したい場合に向いています。
たとえば、次のような条件分岐です。
C#if (status == "New")
{
Console.WriteLine("新規です");
}
else if (status == "Processing")
{
Console.WriteLine("処理中です");
}
else if (status == "Done")
{
Console.WriteLine("完了です");
}
else
{
Console.WriteLine("不明な状態です");
}
このようなコードは、switch caseを使うと次のように整理できます。
C#switch (status)
{
case "New":
Console.WriteLine("新規です");
break;
case "Processing":
Console.WriteLine("処理中です");
break;
case "Done":
Console.WriteLine("完了です");
break;
default:
Console.WriteLine("不明な状態です");
break;
}
条件が増えても、どの値に対してどの処理をしているのかが見やすくなります。
1-4. C#でswitch caseがよく使われる具体例
C#のswitch caseは、次のような場面でよく使われます。
メニュー番号によって処理を分ける場合、ユーザーの権限ごとに表示内容を変える場合、注文ステータスごとにメッセージを変える場合、曜日ごとに処理を変える場合、enumの値ごとに処理を分ける場合などです。
たとえば、注文ステータスによって表示内容を変える処理は、switch caseと相性がよいです。
C#string orderStatus = "Shipped";
switch (orderStatus)
{
case "Pending":
Console.WriteLine("注文を確認中です");
break;
case "Shipped":
Console.WriteLine("商品を発送済みです");
break;
case "Delivered":
Console.WriteLine("配達が完了しました");
break;
default:
Console.WriteLine("不明な注文状態です");
break;
}
このように、決まった値のパターンごとに処理を分けたい場合、C#の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に一致するかによって、実行される処理が決まります。
2-2. switchに指定する値とcaseに指定する値
switchに指定する値と、caseに指定する値は、基本的に比較できる型である必要があります。
たとえば、switchにint型の値を指定した場合、caseにも整数を指定します。
C#int number = 2;
switch (number)
{
case 1:
Console.WriteLine("1です");
break;
case 2:
Console.WriteLine("2です");
break;
default:
Console.WriteLine("1でも2でもありません");
break;
}
switchにstring型の値を指定した場合は、caseにも文字列を指定できます。
C#string color = "Red";
switch (color)
{
case "Red":
Console.WriteLine("赤です");
break;
case "Blue":
Console.WriteLine("青です");
break;
default:
Console.WriteLine("その他の色です");
break;
}
C#では、int、string、char、bool、enumなど、さまざまな型をswitch caseで扱えます。
2-3. breakの役割と書き忘れた場合の注意点
breakは、現在のcaseの処理を終了し、switch文から抜けるために使います。
C#switch (number)
{
case 1:
Console.WriteLine("1です");
break;
case 2:
Console.WriteLine("2です");
break;
}
breakがあることで、case 1の処理が終わったあとに、次のcase 2へ進まず、switch文全体を抜けます。
C#では、処理が書かれているcaseから次のcaseへそのまま流れる書き方は基本的に許可されていません。そのため、break、return、throwなどで処理の終わりを明確にする必要があります。
次のようにbreakを書かないと、コンパイルエラーになります。
C#int number = 1;
switch (number)
{
case 1:
Console.WriteLine("1です");
case 2:
Console.WriteLine("2です");
break;
}
このコードでは、case 1の終わりが明確ではないためエラーになります。
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. int・string・enumで使うswitch caseの基本例
intを使った例です。
C#int level = 2;
switch (level)
{
case 1:
Console.WriteLine("初級");
break;
case 2:
Console.WriteLine("中級");
break;
case 3:
Console.WriteLine("上級");
break;
default:
Console.WriteLine("不明なレベル");
break;
}
stringを使った例です。
C#string role = "Admin";
switch (role)
{
case "Admin":
Console.WriteLine("管理者です");
break;
case "User":
Console.WriteLine("一般ユーザーです");
break;
default:
Console.WriteLine("不明な権限です");
break;
}
enumを使った例です。
C#enum OrderStatus
{
Pending,
Shipped,
Delivered
}
OrderStatus status = OrderStatus.Shipped;
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を使うと、文字列を直接書くよりも入力ミスを防ぎやすくなり、保守しやすいコードになります。
3. C# switch caseの書き方をサンプルコードで理解する
3-1. 数値を条件に分岐するswitch case
数値を条件に分岐する例を見てみましょう。
C#int score = 80;
switch (score)
{
case 100:
Console.WriteLine("満点です");
break;
case 80:
Console.WriteLine("よくできました");
break;
case 60:
Console.WriteLine("合格です");
break;
default:
Console.WriteLine("点数を確認してください");
break;
}
この例では、scoreが80なので、case 80の処理が実行されます。
ただし、この書き方は「80点ちょうど」のように、特定の値だけを判定したい場合に向いています。
「80点以上」のような範囲条件を扱いたい場合は、後述するwhenやパターンマッチング、またはif文を使うとよいでしょう。
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;
}
文字列を使う場合は、大文字と小文字の違いに注意が必要です。
たとえば、"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は、関連する値に名前を付けて管理できる型です。
C#enum UserRole
{
Admin,
Member,
Guest
}
このenumをswitch caseで使うと、権限ごとの処理をわかりやすく書けます。
C#UserRole role = UserRole.Admin;
switch (role)
{
case UserRole.Admin:
Console.WriteLine("すべての機能を利用できます");
break;
case UserRole.Member:
Console.WriteLine("会員向け機能を利用できます");
break;
case UserRole.Guest:
Console.WriteLine("閲覧のみ可能です");
break;
default:
Console.WriteLine("不明な権限です");
break;
}
enumを使うと、"Admin"や"Member"のような文字列を直接書く必要がなくなります。
そのため、スペルミスによるバグを防ぎやすくなります。
3-4. 入力値によって処理を変える実践例
コンソールアプリで、ユーザーの入力値によって処理を変える例です。
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がよく使われます。
条件が番号やコマンドのように決まっている場合、if文よりも見やすく書けます。
3-5. 戻り値を使いたい場合の書き方
switch文の中で値を返したい場合は、メソッド内でreturnを使う書き方ができます。
C#string GetMessage(int menu)
{
switch (menu)
{
case 1:
return "新規登録を行います";
case 2:
return "ログインします";
case 3:
return "終了します";
default:
return "無効なメニューです";
}
}
returnを使う場合、その時点でメソッドの処理が終了します。
そのため、breakを書く必要はありません。
C#Console.WriteLine(GetMessage(2));
このコードを実行すると、次のように表示されます。
C#ログインします
値を返す目的で使う場合は、後述するswitch式を使うとさらに短く書けることがあります。
4. C# switch caseで複数条件を扱う方法
4-1. 複数のcaseで同じ処理を実行する書き方
C#のswitch caseでは、複数のcaseで同じ処理を実行できます。
たとえば、土曜日と日曜日をどちらも「休日」として扱いたい場合です。
C#string day = "Sunday";
switch (day)
{
case "Saturday":
case "Sunday":
Console.WriteLine("休日です");
break;
case "Monday":
case "Tuesday":
case "Wednesday":
case "Thursday":
case "Friday":
Console.WriteLine("平日です");
break;
default:
Console.WriteLine("不明な曜日です");
break;
}
この例では、case "Saturday":とcase "Sunday":のどちらに一致しても、同じ処理が実行されます。
4-2. caseを連続して書く方法
複数のcaseで同じ処理をしたい場合は、caseを連続して書きます。
C#int month = 8;
switch (month)
{
case 12:
case 1:
case 2:
Console.WriteLine("冬です");
break;
case 3:
case 4:
case 5:
Console.WriteLine("春です");
break;
case 6:
case 7:
case 8:
Console.WriteLine("夏です");
break;
case 9:
case 10:
case 11:
Console.WriteLine("秋です");
break;
default:
Console.WriteLine("1〜12の月を入力してください");
break;
}
この書き方は、複数の値を同じグループとして扱いたいときに便利です。
4-3. whenを使って条件を追加する方法
C#では、caseにwhenを組み合わせることで、追加条件を書けます。
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("再テストです");
break;
}
この例では、scoreが85なので、case int n when n >= 80に一致し、「評価はBです」と表示されます。
whenを使うと、単純な値の一致だけでなく、「80以上」「特定の条件を満たす場合」といった分岐も書けます。
4-4. 範囲条件をswitchで扱う方法
C#では、パターンマッチングを使って範囲条件を書くこともできます。
C#int score = 92;
switch (score)
{
case >= 90:
Console.WriteLine("評価はAです");
break;
case >= 80:
Console.WriteLine("評価はBです");
break;
case >= 70:
Console.WriteLine("評価はCです");
break;
case >= 60:
Console.WriteLine("評価はDです");
break;
default:
Console.WriteLine("不合格です");
break;
}
このように書くと、点数の範囲ごとに処理を分けられます。
さらに、andを使って範囲を明確にすることもできます。
C#int age = 25;
switch (age)
{
case >= 0 and <= 12:
Console.WriteLine("子ども料金です");
break;
case >= 13 and <= 64:
Console.WriteLine("通常料金です");
break;
case >= 65:
Console.WriteLine("シニア料金です");
break;
default:
Console.WriteLine("年齢が正しくありません");
break;
}
範囲条件を使うと、switch caseでも柔軟な条件分岐ができます。
4-5. 複雑な条件はif文と組み合わせるべきケース
switch caseは便利ですが、すべての条件分岐に向いているわけではありません。
たとえば、複数の変数を組み合わせた複雑な条件では、if文のほうが自然に書けることがあります。
C#if (age >= 20 && hasLicense && isMember)
{
Console.WriteLine("レンタカーを利用できます");
}
else
{
Console.WriteLine("利用条件を満たしていません");
}
このような条件を無理にswitch caseで書くと、かえって読みにくくなる場合があります。
switch caseは、1つの値を基準に複数の分岐を整理したいときに使うのがおすすめです。
5. C#のswitch文とswitch式の違い
5-1. switch文とは
switch文は、条件に応じて処理を実行するための構文です。
C#int menu = 1;
switch (menu)
{
case 1:
Console.WriteLine("新規登録");
break;
case 2:
Console.WriteLine("ログイン");
break;
default:
Console.WriteLine("無効なメニュー");
break;
}
switch文は、画面に表示する、ファイルに書き込む、メソッドを呼び出すなど、処理を分岐させたい場合に向いています。
5-2. switch式とは
switch式は、条件に応じて値を返すための構文です。
C# 8.0以降で使える書き方で、switch文よりも短く書ける場面があります。
C#int menu = 1;
string message = menu switch
{
1 => "新規登録",
2 => "ログイン",
3 => "終了",
_ => "無効なメニュー"
};
Console.WriteLine(message);
switch式では、caseやbreakを使わず、=>を使って「条件に一致したら返す値」を書きます。
5-3. switch式の基本構文
switch式の基本構文は次のとおりです。
C#変数 switch
{
条件1 => 戻り値1,
条件2 => 戻り値2,
_ => デフォルトの戻り値
};
具体例です。
C#string GetRoleName(string role)
{
return role switch
{
"Admin" => "管理者",
"User" => "一般ユーザー",
"Guest" => "ゲスト",
_ => "不明な権限"
};
}
_は、switch文のdefaultに近い役割を持ちます。
どの条件にも一致しなかった場合に、_の値が返されます。
5-4. switch文とswitch式の使い分け
switch文は、条件ごとに処理を実行したい場合に向いています。
C#switch (command)
{
case "save":
SaveFile();
break;
case "load":
LoadFile();
break;
default:
ShowError();
break;
}
一方、switch式は、条件ごとに値を返したい場合に向いています。
C#string label = status switch
{
"Pending" => "確認中",
"Shipped" => "発送済み",
"Delivered" => "配達完了",
_ => "不明"
};
簡単に言うと、処理を分けるならswitch文、値を作るならswitch式と考えるとわかりやすいです。
5-5. 初心者はどちらから覚えるべきか
初心者は、まずswitch文から覚えるのがおすすめです。
理由は、case、break、defaultの考え方を理解すると、C#の条件分岐の基本が身につくからです。
そのうえで、値を返すだけの分岐が出てきたら、switch式を覚えるとよいでしょう。
たとえば、次のような処理はswitch式で書くとすっきりします。
C#string result = score switch
{
>= 90 => "A",
>= 80 => "B",
>= 70 => "C",
>= 60 => "D",
_ => "F"
};
C#のswitch caseを理解したあとでswitch式を学ぶと、違いがわかりやすくなります。
6. C# switch caseとif文の違い
6-1. if文の特徴
if文は、条件式がtrueかfalseかによって処理を分岐させる構文です。
C#int age = 20;
if (age >= 18)
{
Console.WriteLine("成人です");
}
else
{
Console.WriteLine("未成年です");
}
if文は、比較演算子や論理演算子を使って、自由度の高い条件を書けます。
C#if (age >= 20 && hasTicket)
{
Console.WriteLine("入場できます");
}
このように、複数の条件を組み合わせたい場合は、if文が向いています。
6-2. switch caseの特徴
switch caseは、1つの値に対して複数の候補を比較する場合に向いています。
C#string rank = "A";
switch (rank)
{
case "A":
Console.WriteLine("とても良いです");
break;
case "B":
Console.WriteLine("良いです");
break;
case "C":
Console.WriteLine("普通です");
break;
default:
Console.WriteLine("評価なしです");
break;
}
条件が「この値ならこの処理」という形で並ぶ場合、switch caseのほうが読みやすくなります。
6-3. 可読性で比較する
条件が少ない場合は、if文でも十分です。
C#if (isLogin)
{
Console.WriteLine("ログイン中です");
}
else
{
Console.WriteLine("未ログインです");
}
しかし、同じ変数に対して何度も比較する場合は、switch caseのほうが見やすくなります。
C#if (type == "text")
{
Console.WriteLine("テキストです");
}
else if (type == "image")
{
Console.WriteLine("画像です");
}
else if (type == "video")
{
Console.WriteLine("動画です");
}
else
{
Console.WriteLine("不明な種類です");
}
このコードは、次のように書き換えられます。
C#switch (type)
{
case "text":
Console.WriteLine("テキストです");
break;
case "image":
Console.WriteLine("画像です");
break;
case "video":
Console.WriteLine("動画です");
break;
default:
Console.WriteLine("不明な種類です");
break;
}
switch caseにすることで、typeの値ごとに処理が整理されていることがわかりやすくなります。
6-4. 条件が多い場合の使い分け
条件が多い場合でも、必ずswitch caseを使うべきとは限りません。
次のような条件なら、switch caseが向いています。
C#switch (paymentMethod)
{
case "CreditCard":
Console.WriteLine("クレジットカード決済です");
break;
case "BankTransfer":
Console.WriteLine("銀行振込です");
break;
case "Cash":
Console.WriteLine("現金払いです");
break;
default:
Console.WriteLine("不明な支払い方法です");
break;
}
一方、次のように条件がバラバラの場合は、if文のほうが自然です。
C#if (price >= 10000)
{
Console.WriteLine("送料無料です");
}
else if (isMember)
{
Console.WriteLine("会員割引があります");
}
else if (couponCode != "")
{
Console.WriteLine("クーポンを適用できます");
}
switch caseは、同じ値を基準に分岐するときに使うと効果的です。
6-5. switch caseを使わないほうがよいケース
次のような場合は、switch caseを使わないほうがよいことがあります。
条件が2つだけの場合、複数の変数を組み合わせる場合、条件式が複雑な場合、各caseの処理が長すぎる場合、分岐が頻繁に変更される場合などです。
たとえば、次のような単純な条件ならif文で十分です。
C#if (isActive)
{
Console.WriteLine("有効です");
}
else
{
Console.WriteLine("無効です");
}
無理にswitch caseを使うよりも、読みやすい書き方を選ぶことが大切です。
7. C# switch caseでよくあるエラーと注意点
7-1. breakを書き忘れる
C#のswitch caseでよくあるミスが、breakの書き忘れです。
C#int number = 1;
switch (number)
{
case 1:
Console.WriteLine("1です");
break;
case 2:
Console.WriteLine("2です");
break;
default:
Console.WriteLine("その他です");
break;
}
各caseの最後には、基本的にbreakを書きます。
ただし、メソッドから値を返す場合はreturnを使うこともできます。
C#string GetName(int id)
{
switch (id)
{
case 1:
return "田中";
case 2:
return "佐藤";
default:
return "不明";
}
}
returnを使う場合は、その時点でメソッドが終了するため、breakは不要です。
7-2. caseの値が重複している
同じcaseの値を複数書くと、コンパイルエラーになります。
C#int number = 1;
switch (number)
{
case 1:
Console.WriteLine("1です");
break;
case 1:
Console.WriteLine("もう一度1です");
break;
}
このように、case 1が重複しているためエラーになります。
caseの値は重複しないように注意しましょう。
7-3. defaultを書かずに想定外の値を処理できない
defaultを書かない場合、どのcaseにも一致しない値が来ると、何も処理されません。
C#int menu = 9;
switch (menu)
{
case 1:
Console.WriteLine("新規登録");
break;
case 2:
Console.WriteLine("ログイン");
break;
}
この例では、menuが9なので、何も表示されません。
想定外の値を処理するために、defaultを書いておくと安心です。
C#default:
Console.WriteLine("無効なメニューです");
break;
7-4. 条件が複雑になりすぎて読みにくい
switch caseにwhenを使うと、複雑な条件も書けます。
しかし、条件が複雑になりすぎると、かえって読みにくくなります。
C#switch (userType)
{
case "Member" when age >= 20 && hasCoupon && purchaseCount >= 5:
Console.WriteLine("特別割引の対象です");
break;
default:
Console.WriteLine("通常料金です");
break;
}
このような場合は、条件判定を別のメソッドに分けると読みやすくなります。
C#if (CanUseSpecialDiscount(userType, age, hasCoupon, purchaseCount))
{
Console.WriteLine("特別割引の対象です");
}
else
{
Console.WriteLine("通常料金です");
}
可読性を優先して、switch caseとif文を使い分けましょう。
7-5. nullを扱うときの注意点
文字列やオブジェクトをswitchで扱う場合、nullが入る可能性があります。
C#string command = null;
switch (command)
{
case "start":
Console.WriteLine("開始します");
break;
case "stop":
Console.WriteLine("停止します");
break;
case null:
Console.WriteLine("コマンドが指定されていません");
break;
default:
Console.WriteLine("不明なコマンドです");
break;
}
case nullを書いておくと、nullの場合の処理を明示できます。
また、次のようにToLower()などのメソッドを呼ぶ前には注意が必要です。
C#string command = null;
switch (command.ToLower())
{
case "start":
Console.WriteLine("開始します");
break;
}
このコードでは、commandがnullのため、NullReferenceExceptionが発生します。
安全に書くなら、次のようにします。
C#string command = null;
switch (command?.ToLower())
{
case "start":
Console.WriteLine("開始します");
break;
case null:
Console.WriteLine("コマンドが指定されていません");
break;
default:
Console.WriteLine("不明なコマンドです");
break;
}
nullの可能性がある値を扱うときは、事前に対策しておきましょう。
8. C# switch caseの実践的な使い方
8-1. メニュー選択処理で使う
メニュー選択処理は、C#のswitch caseがよく使われる代表的な例です。
C#Console.WriteLine("メニューを選択してください");
Console.WriteLine("1: 商品一覧");
Console.WriteLine("2: カートを見る");
Console.WriteLine("3: 注文する");
Console.WriteLine("4: 終了");
string input = Console.ReadLine();
switch (input)
{
case "1":
ShowProducts();
break;
case "2":
ShowCart();
break;
case "3":
Order();
break;
case "4":
Console.WriteLine("終了します");
break;
default:
Console.WriteLine("正しい番号を入力してください");
break;
}
処理の中身をメソッドに分けることで、switch case自体をすっきり書けます。
8-2. ユーザー権限ごとに処理を分ける
ユーザー権限によって表示できる機能を変える場合にも、switch caseは便利です。
C#string role = "Admin";
switch (role)
{
case "Admin":
Console.WriteLine("管理画面を表示します");
break;
case "Member":
Console.WriteLine("会員ページを表示します");
break;
case "Guest":
Console.WriteLine("ゲストページを表示します");
break;
default:
Console.WriteLine("権限が確認できません");
break;
}
ただし、権限のように決まった値を扱う場合は、文字列よりもenumを使うと安全です。
8-3. ステータスごとに表示内容を変える
注文、問い合わせ、タスクなどのステータス管理でも、switch caseはよく使われます。
C#string status = "Processing";
switch (status)
{
case "New":
Console.WriteLine("新規受付です");
break;
case "Processing":
Console.WriteLine("対応中です");
break;
case "Completed":
Console.WriteLine("完了しました");
break;
case "Canceled":
Console.WriteLine("キャンセルされました");
break;
default:
Console.WriteLine("不明なステータスです");
break;
}
ステータスの種類が増えても、caseを追加するだけで対応できます。
8-4. enumと組み合わせて保守しやすくする
実務では、switch caseとenumを組み合わせると保守しやすくなります。
C#enum TaskStatus
{
New,
InProgress,
Completed,
Canceled
}
C#TaskStatus status = TaskStatus.InProgress;
switch (status)
{
case TaskStatus.New:
Console.WriteLine("未着手です");
break;
case TaskStatus.InProgress:
Console.WriteLine("作業中です");
break;
case TaskStatus.Completed:
Console.WriteLine("完了です");
break;
case TaskStatus.Canceled:
Console.WriteLine("キャンセルされました");
break;
default:
Console.WriteLine("不明な状態です");
break;
}
enumを使うと、使える値が明確になります。
文字列のスペルミスも防げるため、業務アプリや管理画面などで特に役立ちます。
8-5. メソッド内でswitch caseを整理して書くコツ
switch caseの中に長い処理を書くと、コード全体が読みにくくなります。
そのため、各caseではメソッドを呼び出すだけにすると整理しやすくなります。
C#void ExecuteMenu(string input)
{
switch (input)
{
case "1":
ShowProducts();
break;
case "2":
ShowCart();
break;
case "3":
Order();
break;
default:
ShowInvalidMessage();
break;
}
}
このようにすると、switch caseは「どの条件でどの処理を呼ぶか」だけを担当します。
具体的な処理は別メソッドに分けることで、読みやすく、修正しやすいコードになります。
9. C# switch caseを読みやすく書くコツ
9-1. caseごとの処理を短くする
caseごとの処理が長くなると、switch case全体が読みにくくなります。
C#switch (menu)
{
case 1:
RegisterUser();
break;
case 2:
LoginUser();
break;
case 3:
ExitApplication();
break;
default:
ShowError();
break;
}
このように、各caseではメソッドを呼ぶだけにすると、処理の流れがわかりやすくなります。
9-2. defaultを必ず用意する
defaultは、想定外の値が来たときの受け皿です。
C#default:
Console.WriteLine("不正な値です");
break;
defaultがないと、どのcaseにも一致しなかったときに何も起こらず、原因がわかりにくくなることがあります。
特に、ユーザー入力や外部データを扱う場合は、defaultを書いておくのがおすすめです。
9-3. マジックナンバーを避ける
マジックナンバーとは、意味がわかりにくい数値をコードに直接書くことです。
C#switch (role)
{
case 1:
Console.WriteLine("管理者");
break;
case 2:
Console.WriteLine("一般ユーザー");
break;
}
このコードでは、1や2が何を意味するのか、すぐにはわかりません。
定数を使うと、意味が明確になります。
C#const int Admin = 1;
const int User = 2;
switch (role)
{
case Admin:
Console.WriteLine("管理者");
break;
case User:
Console.WriteLine("一般ユーザー");
break;
}
さらに、権限のような決まった値はenumで管理するとよりわかりやすくなります。
9-4. enumや定数を活用する
switch caseでは、文字列や数値を直接書くよりも、enumや定数を活用したほうが保守しやすくなります。
C#enum PaymentMethod
{
CreditCard,
BankTransfer,
Cash
}
C#PaymentMethod method = PaymentMethod.CreditCard;
switch (method)
{
case PaymentMethod.CreditCard:
Console.WriteLine("クレジットカード決済です");
break;
case PaymentMethod.BankTransfer:
Console.WriteLine("銀行振込です");
break;
case PaymentMethod.Cash:
Console.WriteLine("現金払いです");
break;
default:
Console.WriteLine("不明な支払い方法です");
break;
}
enumを使うことで、選べる値が明確になり、コードの意図も伝わりやすくなります。
9-5. 処理が長い場合はメソッドに分ける
caseの中に長い処理を書くと、どこからどこまでが1つの処理なのかわかりにくくなります。
悪い例です。
C#switch (menu)
{
case 1:
Console.WriteLine("入力チェック");
Console.WriteLine("ユーザー登録");
Console.WriteLine("メール送信");
Console.WriteLine("ログ出力");
break;
}
メソッドに分けると、読みやすくなります。
C#switch (menu)
{
case 1:
RegisterUser();
break;
}
C#void RegisterUser()
{
Console.WriteLine("入力チェック");
Console.WriteLine("ユーザー登録");
Console.WriteLine("メール送信");
Console.WriteLine("ログ出力");
}
switch caseは分岐の見通しをよくするための構文です。
処理が長くなったら、メソッドに分けて整理しましょう。
10. C# switch caseに関するよくある質問
10-1. C#のswitch caseで文字列は使える?
はい、C#のswitch caseでは文字列を使えます。
C#string command = "save";
switch (command)
{
case "save":
Console.WriteLine("保存します");
break;
case "delete":
Console.WriteLine("削除します");
break;
default:
Console.WriteLine("不明なコマンドです");
break;
}
ただし、大文字と小文字は区別されます。
"save"と"Save"は別の値として扱われるため、必要に応じてToLower()やToUpper()で変換してから比較しましょう。
10-2. C#のswitch caseで複数条件は書ける?
はい、書けます。
複数のcaseで同じ処理を実行したい場合は、caseを連続して書きます。
C#switch (day)
{
case "Saturday":
case "Sunday":
Console.WriteLine("休日です");
break;
default:
Console.WriteLine("平日です");
break;
}
また、条件を追加したい場合はwhenを使えます。
C#switch (score)
{
case int n when n >= 80:
Console.WriteLine("高得点です");
break;
default:
Console.WriteLine("通常点です");
break;
}
10-3. C#のswitch caseで範囲指定はできる?
はい、できます。
パターンマッチングを使うと、次のように範囲条件を書けます。
C#int score = 75;
switch (score)
{
case >= 80:
Console.WriteLine("良い点数です");
break;
case >= 60:
Console.WriteLine("合格です");
break;
default:
Console.WriteLine("不合格です");
break;
}
また、andを使って範囲を指定することもできます。
C#int age = 30;
switch (age)
{
case >= 20 and <= 64:
Console.WriteLine("成人です");
break;
default:
Console.WriteLine("対象外です");
break;
}
10-4. switch caseとif文はどちらを使うべき?
1つの値に対して複数の候補を比較するなら、switch caseが向いています。
C#switch (status)
{
case "New":
Console.WriteLine("新規");
break;
case "Done":
Console.WriteLine("完了");
break;
}
一方、複数の条件を組み合わせるなら、if文が向いています。
C#if (age >= 20 && hasLicense)
{
Console.WriteLine("利用できます");
}
どちらが優れているというより、条件の内容に合わせて使い分けることが大切です。
10-5. breakとreturnはどう使い分ける?
breakは、switch文から抜けるために使います。
C#switch (menu)
{
case 1:
Console.WriteLine("新規登録");
break;
}
returnは、メソッドの処理そのものを終了して、値を返すために使います。
C#string GetMenuName(int menu)
{
switch (menu)
{
case 1:
return "新規登録";
case 2:
return "ログイン";
default:
return "不明";
}
}
caseの中で処理をしたあとにswitch文だけを抜けたいならbreak、メソッドを終了したいならreturnを使います。
10-6. defaultは必ず書くべき?
defaultは必須ではありません。
しかし、実務ではできるだけ書くことをおすすめします。
C#switch (status)
{
case "Active":
Console.WriteLine("有効です");
break;
case "Inactive":
Console.WriteLine("無効です");
break;
default:
Console.WriteLine("不明な状態です");
break;
}
defaultを書いておくと、想定外の値が来たときに適切な処理ができます。
特に、ユーザー入力、外部API、データベースの値など、自分で完全に制御できない値を扱う場合は、defaultを用意しておくと安心です。
まとめ
C#のswitch caseは、条件分岐を見やすく整理するための便利な構文です。
switchには判定したい値を指定し、caseには一致したときの処理を書きます。どのcaseにも一致しない場合の処理にはdefaultを使います。
基本的な形は次のとおりです。
C#switch (value)
{
case 1:
Console.WriteLine("1です");
break;
case 2:
Console.WriteLine("2です");
break;
default:
Console.WriteLine("その他です");
break;
}
switch caseは、メニュー選択、ユーザー権限、注文ステータス、enumの分岐など、決まった値ごとに処理を変えたい場面で役立ちます。
一方で、複数の変数を組み合わせる複雑な条件や、条件式が自由に変化する処理では、if文のほうが読みやすい場合もあります。
また、値を返すだけの分岐であれば、switch式を使うとコードを短く書けます。
C#string message = status switch
{
"New" => "新規",
"Processing" => "処理中",
"Done" => "完了",
_ => "不明"
};
C#でswitch caseを使うときは、breakの書き忘れ、caseの重複、defaultの不足、nullの扱いに注意しましょう。
読みやすいコードを書くためには、caseごとの処理を短くし、長い処理はメソッドに分け、文字列や数値を直接書きすぎず、enumや定数を活用することが大切です。
C#のswitch caseを正しく使えるようになると、条件分岐の多いコードをすっきり整理でき、保守しやすいプログラムを書けるようになります。

