C#のcase文を完全解説|switch文の基本構文・使い方・条件分岐の書き方を初心者向けに紹介
はじめに
C#で条件分岐を書くときによく使われるのが、switch文とcaseです。英語では「csharp case statement」と検索されることもありますが、正確にはC#に「case文」という独立した文があるわけではなく、switch文の中でcaseラベルを使って処理を分けます。
たとえば、入力された数値、文字列、曜日、ステータス、列挙型などに応じて処理を切り替えたい場合、switch caseを使うとコードを読みやすく整理できます。
この記事では、C#のcase文としてよく検索されるswitch caseの基本構文、使い方、breakやdefaultの役割、when句やパターンマッチング、switch式との違いまで、初心者向けにわかりやすく解説します。C#のswitch文は、式の値やパターンに基づいて実行する処理を選ぶ構文です。
1. C#のcase文とは?switch文で条件分岐を書くための基本
1-1. C#に「case文」単体はなく、switch文の中でcaseを使う
C#で「case文」と呼ばれるものは、多くの場合、switch文の中に書くcaseのことを指します。
C#switch (値)
{
case 条件1:
// 条件1に一致したときの処理
break;
case 条件2:
// 条件2に一致したときの処理
break;
default:
// どれにも一致しないときの処理
break;
}
caseは単独で使うものではなく、必ずswitch文の中で使います。
つまり、初心者が「C#のcase文を覚えたい」と思った場合、実際にはswitch文の書き方を理解することが大切です。
1-2. switch文でできること:値に応じて処理を分ける
switch文は、ある値を見て、その値に一致するcaseの処理を実行するための構文です。
たとえば、ユーザーが入力した番号に応じてメニューを切り替える場合に使えます。
C#int menu = 2;
switch (menu)
{
case 1:
Console.WriteLine("新規作成");
break;
case 2:
Console.WriteLine("編集");
break;
case 3:
Console.WriteLine("削除");
break;
default:
Console.WriteLine("不正なメニューです");
break;
}
この例では、menuの値が2なので、case 2:の処理が実行されます。
編集
このように、値ごとに処理を分けたいときにswitch caseは便利です。
1-3. if文との違いと、case文を使うべき場面
C#の条件分岐にはif文もあります。if文は、条件式がtrueかどうかで処理を分ける構文です。一方、switch文は、式の値やパターンに応じて複数の候補から実行する処理を選ぶ構文です。
たとえば、次のようなif文があります。
C#int status = 1;
if (status == 0)
{
Console.WriteLine("未処理");
}
else if (status == 1)
{
Console.WriteLine("処理中");
}
else if (status == 2)
{
Console.WriteLine("完了");
}
else
{
Console.WriteLine("不明");
}
これをswitch caseで書くと、次のようになります。
C#int status = 1;
switch (status)
{
case 0:
Console.WriteLine("未処理");
break;
case 1:
Console.WriteLine("処理中");
break;
case 2:
Console.WriteLine("完了");
break;
default:
Console.WriteLine("不明");
break;
}
同じ変数の値を何度も比較する場合は、switch caseのほうが読みやすくなることが多いです。
1-4. 初心者がまず覚えるべきswitch・case・break・defaultの役割
C#のswitch caseを理解するために、まず次の4つの役割を覚えましょう。
| キーワード | 役割 |
|---|---|
switch | 判定したい値を書く |
case | 値が一致したときの処理を書く |
break | switch文から抜ける |
default | どのcaseにも一致しない場合の処理を書く |
基本形は次のとおりです。
C#switch (判定する値)
{
case 値1:
// 値1の場合の処理
break;
case 値2:
// 値2の場合の処理
break;
default:
// どれにも一致しない場合の処理
break;
}
まずはこの形を覚えれば、C#のcase文の基本は理解できます。
2. C#のswitch case文の基本構文
2-1. switch case文の書き方
C#のswitch caseは、次のように書きます。
C#switch (expression)
{
case value1:
// value1に一致したときの処理
break;
case value2:
// value2に一致したときの処理
break;
default:
// どのcaseにも一致しないときの処理
break;
}
具体例を見てみましょう。
C#int number = 1;
switch (number)
{
case 1:
Console.WriteLine("One");
break;
case 2:
Console.WriteLine("Two");
break;
default:
Console.WriteLine("Other");
break;
}
numberが1なので、case 1:の処理が実行されます。
2-2. caseに一致したときの処理の流れ
switch文では、switchの括弧内に書いた値と一致するcaseが探されます。
C#string color = "red";
switch (color)
{
case "blue":
Console.WriteLine("青です");
break;
case "red":
Console.WriteLine("赤です");
break;
case "green":
Console.WriteLine("緑です");
break;
default:
Console.WriteLine("その他の色です");
break;
}
この場合、colorは"red"なので、次の出力になります。
赤です
一致したcaseが見つかると、そのcase内の処理が実行されます。
2-3. breakで処理を抜ける仕組み
breakは、switch文の処理を終了するために使います。C#のbreak文は、最も内側にあるswitch文または繰り返し文を終了します。
C#int number = 2;
switch (number)
{
case 1:
Console.WriteLine("1です");
break;
case 2:
Console.WriteLine("2です");
break;
case 3:
Console.WriteLine("3です");
break;
}
case 2:の処理が実行されたあと、breakによってswitch文を抜けます。
C#では、処理のあるcaseから次のcaseへそのまま流れるフォールスルーは基本的に許可されません。breakを書き忘れて、switchセクションの終点に到達できる状態になるとコンパイルエラーになります。
2-4. defaultでどのcaseにも当てはまらない場合を処理する
defaultは、どのcaseにも一致しなかった場合に実行される処理です。
C#int rank = 5;
switch (rank)
{
case 1:
Console.WriteLine("金賞");
break;
case 2:
Console.WriteLine("銀賞");
break;
case 3:
Console.WriteLine("銅賞");
break;
default:
Console.WriteLine("入賞なし");
break;
}
この例では、rankが1、2、3のどれでもないため、defaultが実行されます。
入賞なし
defaultは必須ではありませんが、想定外の値を処理するために書いておくと安全です。
2-5. switch文で使用できる値の型
C#のswitch文では、数値、文字、文字列、enumなどの値を使った分岐がよく使われます。
C#int number = 1;
string name = "Alice";
DayOfWeek day = DayOfWeek.Monday;
また、現在のC#ではパターンマッチングを使うことで、型による分岐や条件付きの分岐も書けます。C#のパターンマッチングでは、式が特定の特徴を持っているかを調べ、それに応じて処理できます。
たとえば、次のように型で分岐できます。
C#object value = "Hello";
switch (value)
{
case int i:
Console.WriteLine($"整数です: {i}");
break;
case string s:
Console.WriteLine($"文字列です: {s}");
break;
default:
Console.WriteLine("その他の型です");
break;
}
3. C#のcase文の基本的な使い方
3-1. 数値を条件に分岐する例
数値による分岐は、switch caseの基本です。
C#int score = 3;
switch (score)
{
case 1:
Console.WriteLine("評価: 悪い");
break;
case 2:
Console.WriteLine("評価: 普通");
break;
case 3:
Console.WriteLine("評価: 良い");
break;
default:
Console.WriteLine("評価対象外");
break;
}
この例では、scoreが3なので、case 3:の処理が実行されます。
評価: 良い
数値コード、ステータス番号、メニュー番号などを処理するときによく使います。
3-2. 文字列を条件に分岐する例
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"なので、次のように出力されます。
開始します
文字列の値で処理を分けたいときは、if文を何度も書くよりswitch caseのほうが見やすくなることがあります。
3-3. enumを使って分岐する例
enumは、決まった値の集合を名前付きで扱うための型です。ステータスや種類を表すときによく使います。
C#enum OrderStatus
{
Pending,
Processing,
Completed,
Canceled
}
このenumをswitch caseで分岐すると、次のように書けます。
C#OrderStatus status = OrderStatus.Processing;
switch (status)
{
case OrderStatus.Pending:
Console.WriteLine("注文は保留中です");
break;
case OrderStatus.Processing:
Console.WriteLine("注文を処理中です");
break;
case OrderStatus.Completed:
Console.WriteLine("注文は完了しました");
break;
case OrderStatus.Canceled:
Console.WriteLine("注文はキャンセルされました");
break;
default:
Console.WriteLine("不明な注文状態です");
break;
}
enumを使うと、0や1のような意味がわかりにくい値ではなく、OrderStatus.Processingのように意味のある名前で条件分岐を書けます。
3-4. 複数のcaseで同じ処理を実行する書き方
複数のcaseで同じ処理を実行したい場合は、caseを連続して書きます。
C#int month = 8;
switch (month)
{
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;
case 12:
case 1:
case 2:
Console.WriteLine("冬です");
break;
default:
Console.WriteLine("不正な月です");
break;
}
この例では、monthが8なので、case 6:、case 7:、case 8:のグループに入り、次のように出力されます。
夏です
C#では、空のcaseを並べて同じ処理にまとめる書き方がよく使われます。
3-5. defaultを最後に書くべきかどうか
defaultは、必ず最後に書かなければならないわけではありません。ただし、一般的には最後に書くことが多いです。
C#switch (value)
{
case 1:
Console.WriteLine("1です");
break;
case 2:
Console.WriteLine("2です");
break;
default:
Console.WriteLine("その他です");
break;
}
defaultを最後に書くと、「どの条件にも当てはまらなかった場合の処理」として読みやすくなります。
特別な理由がない限り、初心者のうちはdefaultを最後に書く習慣をつけるとよいでしょう。
4. case文でよく使う実践パターン
4-1. メニュー選択の処理を書く
コンソールアプリや簡単なツールでは、ユーザーのメニュー選択に応じて処理を分ける場面があります。
C#Console.WriteLine("1: 登録");
Console.WriteLine("2: 更新");
Console.WriteLine("3: 削除");
int menu = 1;
switch (menu)
{
case 1:
Console.WriteLine("登録処理を実行します");
break;
case 2:
Console.WriteLine("更新処理を実行します");
break;
case 3:
Console.WriteLine("削除処理を実行します");
break;
default:
Console.WriteLine("正しいメニュー番号を入力してください");
break;
}
メニュー番号のように、決まった値に応じて処理を切り替える場面では、switch caseが向いています。
4-2. 曜日やステータスごとに処理を分ける
曜日によってメッセージを変える例です。
C#DayOfWeek today = DayOfWeek.Saturday;
switch (today)
{
case DayOfWeek.Monday:
Console.WriteLine("月曜日です");
break;
case DayOfWeek.Friday:
Console.WriteLine("金曜日です");
break;
case DayOfWeek.Saturday:
case DayOfWeek.Sunday:
Console.WriteLine("週末です");
break;
default:
Console.WriteLine("平日です");
break;
}
DayOfWeekは曜日を表すenumなので、数値よりも意味がわかりやすいコードになります。
4-3. 入力値に応じてメッセージを切り替える
ユーザーの入力値に応じてメッセージを切り替える場合にも、switch caseは便利です。
C#string input = "yes";
switch (input)
{
case "yes":
Console.WriteLine("処理を続行します");
break;
case "no":
Console.WriteLine("処理を中止します");
break;
default:
Console.WriteLine("yes または no を入力してください");
break;
}
入力文字列が限られている場合、switch caseを使うと分岐が整理されます。
4-4. enumとswitch caseを組み合わせて可読性を高める
業務アプリでは、注文状態、支払い状態、ユーザー権限などを扱うことがよくあります。
C#enum UserRole
{
Admin,
Editor,
Viewer
}
enumとswitch caseを組み合わせると、権限ごとの処理を読みやすく書けます。
C#UserRole role = UserRole.Admin;
switch (role)
{
case UserRole.Admin:
Console.WriteLine("すべての操作が可能です");
break;
case UserRole.Editor:
Console.WriteLine("編集が可能です");
break;
case UserRole.Viewer:
Console.WriteLine("閲覧のみ可能です");
break;
default:
Console.WriteLine("不明な権限です");
break;
}
case 0:やcase 1:のように数値だけで書くよりも、case UserRole.Admin:のほうが意味が伝わりやすくなります。
4-5. 戻り値を返す処理でswitch caseを使う
switch caseは、メソッドの中で戻り値を返す処理にも使えます。
C#static string GetStatusMessage(int status)
{
switch (status)
{
case 0:
return "未処理";
case 1:
return "処理中";
case 2:
return "完了";
default:
return "不明";
}
}
returnを使う場合は、その時点でメソッドの処理が終了するため、通常はbreakを書かなくても問題ありません。
C#string message = GetStatusMessage(1);
Console.WriteLine(message);
出力は次のようになります。
処理中
5. C#のcase文で条件を指定する応用構文
5-1. when句を使ってcaseに追加条件を付ける
C#では、caseにwhen句を付けて追加条件を書くことができます。
C#int score = 85;
switch (score)
{
case int s when s >= 90:
Console.WriteLine("評価: A");
break;
case int s when s >= 70:
Console.WriteLine("評価: B");
break;
case int s when s >= 50:
Console.WriteLine("評価: C");
break;
default:
Console.WriteLine("評価: D");
break;
}
この例では、scoreが85なので、case int s when s >= 70:に一致します。
評価: B
when句を使うと、単純な値の一致だけでなく、追加条件を組み合わせた分岐ができます。C#のパターンマッチングでは、switchと組み合わせて条件に合うパターンを選べます。
5-2. 範囲条件をswitch caseで書く方法
点数の範囲によって評価を分けたい場合、when句を使う方法があります。
C#int score = 72;
switch (score)
{
case int s when s >= 80:
Console.WriteLine("合格: 優秀");
break;
case int s when s >= 60:
Console.WriteLine("合格");
break;
case int s when s >= 0:
Console.WriteLine("不合格");
break;
default:
Console.WriteLine("点数が不正です");
break;
}
また、C#のパターンマッチングでは、関係パターンを使って範囲条件をより短く書くこともできます。and、or、notなどのパターンを組み合わせて条件を表現できます。
C#int score = 72;
switch (score)
{
case >= 80:
Console.WriteLine("合格: 優秀");
break;
case >= 60:
Console.WriteLine("合格");
break;
case >= 0:
Console.WriteLine("不合格");
break;
default:
Console.WriteLine("点数が不正です");
break;
}
範囲条件を書く場合は、上から順番に評価されることを意識して、広すぎる条件を先に書かないようにしましょう。
5-3. 型によって処理を分けるパターンマッチング
switch caseでは、値だけでなく型によって処理を分けることもできます。
C#object data = 123;
switch (data)
{
case int number:
Console.WriteLine($"整数です: {number}");
break;
case string text:
Console.WriteLine($"文字列です: {text}");
break;
case bool flag:
Console.WriteLine($"真偽値です: {flag}");
break;
default:
Console.WriteLine("その他の型です");
break;
}
この例では、dataに123が入っているため、case int number:に一致します。
整数です: 123
型ごとに処理を分けたい場合、if (data is int)を何度も書くより、switch caseのほうが見通しがよくなります。
5-4. nullをcaseで判定する方法
switch caseでは、nullを判定することもできます。
C#string? name = null;
switch (name)
{
case null:
Console.WriteLine("名前が未設定です");
break;
case "":
Console.WriteLine("名前が空文字です");
break;
default:
Console.WriteLine($"こんにちは、{name}さん");
break;
}
この例では、nameがnullなので、case null:が実行されます。
名前が未設定です
nullの可能性がある値を扱う場合は、case null:やdefaultを使って想定外の状態を処理しておくと安全です。
5-5. 複雑な条件分岐はif文とswitch文のどちらで書くべきか
switch caseは、同じ値や同じ対象をもとに複数の分岐を行うときに便利です。
一方で、次のような複雑な条件が多い場合は、if文のほうが自然です。
C#if (age >= 20 && hasLicense && isActive)
{
Console.WriteLine("利用可能です");
}
else
{
Console.WriteLine("利用できません");
}
複数の変数を組み合わせたり、条件式がそれぞれ大きく異なったりする場合は、無理にswitch caseにしないほうが読みやすいことがあります。
判断基準は、「コードを読んだ人がすぐ理解できるか」です。
6. switch式とswitch文の違い
6-1. C#のswitch式とは
C#には、switch文とは別にswitch式があります。
switch文は処理を実行するための構文です。
C#switch (status)
{
case 0:
Console.WriteLine("未処理");
break;
case 1:
Console.WriteLine("処理中");
break;
}
一方、switch式は値を返すための構文です。switch式は、値の代入や戻り値を返す場面でよく使われます。
C#string message = status switch
{
0 => "未処理",
1 => "処理中",
2 => "完了",
_ => "不明"
};
短い条件分岐で値を返したい場合、switch式を使うとコードがすっきりします。
6-2. switch文とswitch式の構文の違い
switch文は、caseとbreakを使って処理を書きます。
C#switch (value)
{
case 1:
Console.WriteLine("One");
break;
default:
Console.WriteLine("Other");
break;
}
switch式は、=>を使って結果の値を書きます。
C#string result = value switch
{
1 => "One",
2 => "Two",
_ => "Other"
};
大きな違いは、switch文は「処理の実行」に向いていて、switch式は「値を返す」ことに向いている点です。
6-3. switch式で値を返す書き方
メソッドの戻り値をswitch式で返す例です。
C#static string GetDayType(DayOfWeek day)
{
return day switch
{
DayOfWeek.Saturday => "休日",
DayOfWeek.Sunday => "休日",
_ => "平日"
};
}
さらに、同じ結果を返す条件はorでまとめることもできます。
C#static string GetDayType(DayOfWeek day)
{
return day switch
{
DayOfWeek.Saturday or DayOfWeek.Sunday => "休日",
_ => "平日"
};
}
switch式を使うと、単純な値の変換処理を短く書けます。
6-4. discardパターン「_」の使い方
switch式でよく使われる_は、discardパターンと呼ばれます。
C#string message = status switch
{
0 => "未処理",
1 => "処理中",
2 => "完了",
_ => "不明"
};
_は、どの条件にも一致しなかった場合の受け皿として使われます。switch式で全ての入力値を扱うには、discardパターンのアームを用意する方法があります。
switch文のdefaultに近い役割だと考えると理解しやすいです。
6-5. switch式を使うとコードが短くなるケース
次のようなswitch文があるとします。
C#static string GetRoleName(int role)
{
switch (role)
{
case 1:
return "管理者";
case 2:
return "編集者";
case 3:
return "閲覧者";
default:
return "不明";
}
}
これをswitch式で書くと、次のようになります。
C#static string GetRoleName(int role)
{
return role switch
{
1 => "管理者",
2 => "編集者",
3 => "閲覧者",
_ => "不明"
};
}
値を返すだけの処理なら、switch式のほうが簡潔です。
ただし、複数行の処理や副作用のある処理を行う場合は、従来のswitch文のほうが読みやすいこともあります。
7. C#のcase文で起きやすいエラーと注意点
7-1. breakを書き忘れたときのエラー
C#のswitch caseでは、処理のあるcaseの最後にbreak、return、throwなどを書いて、次のcaseへ処理が流れないようにする必要があります。
C#int value = 1;
switch (value)
{
case 1:
Console.WriteLine("1です");
case 2:
Console.WriteLine("2です");
break;
}
このようにcase 1:の最後にbreakがないと、コンパイルエラーになります。C#では、switchセクションの終点に到達できる状態、つまり次のセクションへ落ちる状態は許可されません。
正しくは次のように書きます。
C#switch (value)
{
case 1:
Console.WriteLine("1です");
break;
case 2:
Console.WriteLine("2です");
break;
}
7-2. 同じcase値を複数書いたときのエラー
同じcase値を複数書くことはできません。
C#int value = 1;
switch (value)
{
case 1:
Console.WriteLine("A");
break;
case 1:
Console.WriteLine("B");
break;
}
このように同じcase 1:を複数書くとエラーになります。
同じ処理をしたい場合は、重複して書くのではなく、複数のcaseをまとめましょう。
C#switch (value)
{
case 1:
case 2:
Console.WriteLine("1または2です");
break;
}
7-3. caseに変数や条件式を直接書けないケース
単純なcaseでは、変数や通常の条件式をそのまま書けない場合があります。
C#int value = 10;
int target = 10;
switch (value)
{
// case target: のような書き方は基本的にできない
}
値が定数でない場合は、when句を使う方法があります。
C#int value = 10;
int target = 10;
switch (value)
{
case int x when x == target:
Console.WriteLine("targetと一致しました");
break;
default:
Console.WriteLine("一致しませんでした");
break;
}
また、単純な条件式だけならif文のほうが自然な場合もあります。
C#if (value == target)
{
Console.WriteLine("targetと一致しました");
}
7-4. 到達不能なcaseがあるときのエラー
パターンマッチングを使う場合、広い条件を先に書くと、後ろのcaseに到達できなくなることがあります。
C#object value = "hello";
switch (value)
{
case object obj:
Console.WriteLine("objectです");
break;
case string text:
Console.WriteLine("stringです");
break;
}
この例では、stringもobjectに含まれるため、先にcase object obj:を書くと、case string text:に到達できません。
正しくは、より具体的な条件を先に書きます。
C#switch (value)
{
case string text:
Console.WriteLine($"stringです: {text}");
break;
case object obj:
Console.WriteLine("objectです");
break;
}
switch caseでは、条件の順番が読みやすさだけでなく、実行結果にも影響することがあります。
7-5. defaultを書かない場合の注意点
defaultは必須ではありません。
C#int value = 3;
switch (value)
{
case 1:
Console.WriteLine("1です");
break;
case 2:
Console.WriteLine("2です");
break;
}
この場合、valueが1でも2でもなければ、何も実行されません。
それが意図した動作なら問題ありませんが、想定外の値を見逃す原因になることがあります。
特に、外部入力、APIの結果、データベースの値などを扱う場合は、defaultで想定外の値を処理することをおすすめします。
C#default:
Console.WriteLine("想定外の値です");
break;
8. case文とif文の使い分け
8-1. 値の一致判定が多いならswitch caseが向いている
同じ変数に対して、複数の値と一致するかを判定する場合は、switch caseが向いています。
C#switch (command)
{
case "add":
Add();
break;
case "update":
Update();
break;
case "delete":
Delete();
break;
default:
ShowError();
break;
}
このような処理をif文で書くと、次のようになります。
C#if (command == "add")
{
Add();
}
else if (command == "update")
{
Update();
}
else if (command == "delete")
{
Delete();
}
else
{
ShowError();
}
どちらでも書けますが、条件が増えるほどswitch caseのほうが整理しやすくなります。
8-2. 複雑な条件式が多いならif文が向いている
複雑な条件式が多い場合は、if文のほうが向いています。
C#if (user.IsActive && user.Age >= 20 && user.HasPermission)
{
Console.WriteLine("利用できます");
}
else
{
Console.WriteLine("利用できません");
}
複数の変数を組み合わせる条件や、真偽値の組み合わせが中心の処理は、if文で書いたほうが自然です。
switch caseに無理やりまとめると、かえって読みにくくなることがあります。
8-3. 可読性を基準に選ぶ考え方
switch caseとif文のどちらを使うか迷ったら、可読性を基準にしましょう。
たとえば、次のような場合はswitch caseが読みやすいです。
C#switch (status)
{
case OrderStatus.Pending:
Console.WriteLine("保留中");
break;
case OrderStatus.Processing:
Console.WriteLine("処理中");
break;
case OrderStatus.Completed:
Console.WriteLine("完了");
break;
}
一方、次のような場合はif文が読みやすいです。
C#if (order.TotalPrice >= 10000 && order.IsPaid)
{
Console.WriteLine("送料無料です");
}
「同じ対象の値を分けるならswitch case」「条件式そのものが重要ならif文」と考えると選びやすくなります。
8-4. 保守しやすい条件分岐を書くコツ
保守しやすい条件分岐を書くには、次の点を意識しましょう。
| ポイント | 内容 |
|---|---|
| 条件を増やしすぎない | 分岐が多すぎる場合は設計を見直す |
| 処理を短くする | case内に長い処理を書かない |
| 名前をわかりやすくする | enumや定数を使う |
| 想定外を処理する | defaultを活用する |
| メソッドに分ける | 複雑な処理は別メソッドにする |
読みやすい条件分岐は、後から修正しやすく、バグも見つけやすくなります。
9. C#のcase文をきれいに書くベストプラクティス
9-1. caseごとの処理を短くする
caseの中に長い処理を書くと、switch文全体が読みにくくなります。
C#switch (command)
{
case "save":
Save();
break;
case "load":
Load();
break;
case "delete":
Delete();
break;
}
このように、各caseではメソッドを呼び出すだけにすると見通しがよくなります。
避けたい例は次のようなコードです。
C#switch (command)
{
case "save":
// 入力チェック
// ファイル作成
// データ変換
// 保存処理
// ログ出力
break;
}
処理が長くなったら、別メソッドに分けましょう。
9-2. enumを活用してマジックナンバーを避ける
case 1:やcase 2:のような数値だけの分岐は、意味がわかりにくくなることがあります。
C#switch (status)
{
case 1:
Console.WriteLine("処理中");
break;
case 2:
Console.WriteLine("完了");
break;
}
このような数値をマジックナンバーと呼びます。
enumを使うと、意味が明確になります。
C#enum TaskStatus
{
Waiting,
Running,
Finished
}
C#switch (status)
{
case TaskStatus.Waiting:
Console.WriteLine("待機中");
break;
case TaskStatus.Running:
Console.WriteLine("実行中");
break;
case TaskStatus.Finished:
Console.WriteLine("完了");
break;
}
数値ではなく名前で分岐することで、コードの意図が伝わりやすくなります。
9-3. defaultで想定外の値を処理する
defaultは、想定外の値を処理するために重要です。
C#switch (status)
{
case TaskStatus.Waiting:
Console.WriteLine("待機中");
break;
case TaskStatus.Running:
Console.WriteLine("実行中");
break;
case TaskStatus.Finished:
Console.WriteLine("完了");
break;
default:
throw new ArgumentOutOfRangeException(nameof(status), "不正なステータスです");
}
エラーとして扱うべき値なら、defaultで例外を投げるのも有効です。
特に、enumに将来値が追加される可能性がある場合、defaultで想定外を検出できるようにしておくと安心です。
9-4. 複雑になったらメソッドに分ける
switch caseが長くなりすぎたら、処理をメソッドに分けましょう。
C#switch (command)
{
case "create":
CreateUser();
break;
case "update":
UpdateUser();
break;
case "delete":
DeleteUser();
break;
default:
ShowUnknownCommandMessage();
break;
}
メソッド名を見れば何をしているかがわかるため、switch文全体が読みやすくなります。
さらに分岐が多くなりすぎる場合は、クラス設計やポリモーフィズム、辞書を使った処理の振り分けなどを検討してもよいでしょう。
9-5. switch式でシンプルに書ける処理は置き換える
値を返すだけのswitch caseは、switch式に置き換えると短く書けます。
C#static string GetStatusText(TaskStatus status)
{
return status switch
{
TaskStatus.Waiting => "待機中",
TaskStatus.Running => "実行中",
TaskStatus.Finished => "完了",
_ => "不明"
};
}
ただし、すべてをswitch式にすればよいわけではありません。
次のような場合は、従来のswitch文のほうが読みやすいことがあります。
C#switch (status)
{
case TaskStatus.Running:
StartTimer();
WriteLog();
NotifyUser();
break;
}
「値を返すだけならswitch式」「複数の処理を実行するならswitch文」と考えると使い分けやすくなります。
10. C#のcase文に関するよくある質問
10-1. C#でcase文だけを単独で使える?
C#では、caseだけを単独で使うことはできません。
caseはswitch文の中で使うラベルです。
C#switch (value)
{
case 1:
Console.WriteLine("1です");
break;
}
そのため、「C#のcase文」と言う場合、多くはswitch caseのことを指します。
10-2. caseに複数条件を書くには?
複数の値で同じ処理をしたい場合は、caseを並べます。
C#switch (day)
{
case DayOfWeek.Saturday:
case DayOfWeek.Sunday:
Console.WriteLine("休日です");
break;
}
switch式では、orパターンを使ってまとめることもできます。
C#string result = day switch
{
DayOfWeek.Saturday or DayOfWeek.Sunday => "休日",
_ => "平日"
};
追加条件を付けたい場合は、when句を使います。
C#switch (score)
{
case int s when s >= 80:
Console.WriteLine("高得点です");
break;
}
10-3. caseで範囲指定はできる?
できます。
when句を使う方法があります。
C#switch (score)
{
case int s when s >= 80:
Console.WriteLine("A");
break;
case int s when s >= 60:
Console.WriteLine("B");
break;
}
また、関係パターンを使うと、より短く書けます。
C#switch (score)
{
case >= 80:
Console.WriteLine("A");
break;
case >= 60:
Console.WriteLine("B");
break;
default:
Console.WriteLine("C");
break;
}
範囲条件を書くときは、条件の順番に注意しましょう。
10-4. caseの順番に意味はある?
あります。
switch文は、条件に一致するcaseを探して処理します。特に、パターンマッチングや範囲条件を使う場合は、順番が重要です。
C#switch (score)
{
case >= 60:
Console.WriteLine("合格");
break;
case >= 80:
Console.WriteLine("優秀");
break;
}
この例では、scoreが90でも先にcase >= 60:に一致してしまうため、case >= 80:には到達しません。
正しくは、より具体的な条件を先に書きます。
C#switch (score)
{
case >= 80:
Console.WriteLine("優秀");
break;
case >= 60:
Console.WriteLine("合格");
break;
}
10-5. defaultは必ず必要?
defaultは必須ではありません。
ただし、どのcaseにも一致しなかった場合に何も起きないため、想定外の値を見逃す可能性があります。
C#switch (value)
{
case 1:
Console.WriteLine("1です");
break;
}
安全に書くなら、defaultを用意しておくのがおすすめです。
C#default:
Console.WriteLine("想定外の値です");
break;
特に、ユーザー入力や外部データを扱う場合は、defaultで不正値を処理しましょう。
10-6. switch caseとswitch式はどちらを使えばいい?
処理を実行したい場合は、switch caseを使うとよいです。
C#switch (command)
{
case "save":
Save();
break;
case "load":
Load();
break;
}
値を返したいだけなら、switch式が向いています。
C#string message = status switch
{
0 => "未処理",
1 => "処理中",
2 => "完了",
_ => "不明"
};
目安としては、次のように使い分けるとよいでしょう。
| 場面 | 向いている構文 |
|---|---|
| 複数行の処理を実行する | switch文 |
| メソッドを呼び分ける | switch文 |
| 値を返す | switch式 |
| 変換処理を短く書く | switch式 |
まとめ
C#のcase文とは、正確にはswitch文の中で使うcaseラベルのことです。switch caseを使うと、数値、文字列、enum、型、パターンなどに応じて処理をわかりやすく分岐できます。
基本構文は次の形です。
C#switch (value)
{
case 1:
Console.WriteLine("1です");
break;
case 2:
Console.WriteLine("2です");
break;
default:
Console.WriteLine("その他です");
break;
}
初心者がまず覚えるべきポイントは、次の4つです。
| キーワード | 役割 |
|---|---|
switch | 判定する値を書く |
case | 一致した値ごとの処理を書く |
break | switch文から抜ける |
default | どれにも一致しない場合を処理する |
値の一致判定が多い場合はswitch case、複雑な条件式が多い場合はif文、値を返すだけならswitch式を使うと、読みやすく保守しやすいコードになります。
C#のswitch caseは、基本を覚えればすぐに実践で使える便利な条件分岐です。まずは数値や文字列の分岐から始め、慣れてきたらenum、when句、パターンマッチング、switch式も活用していきましょう。

