C#のcase文を完全解説|switch文の基本構文・使い方・条件分岐の書き方を初心者向けに紹介

はじめに

C#で条件分岐を書くときによく使われるのが、switch文とcaseです。英語では「csharp case statement」と検索されることもありますが、正確にはC#に「case文」という独立した文があるわけではなく、switch文の中でcaseラベルを使って処理を分けます。

たとえば、入力された数値、文字列、曜日、ステータス、列挙型などに応じて処理を切り替えたい場合、switch caseを使うとコードを読みやすく整理できます。

この記事では、C#のcase文としてよく検索されるswitch caseの基本構文、使い方、breakdefaultの役割、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値が一致したときの処理を書く
breakswitch文から抜ける
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;
}

number1なので、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;
}

この例では、rank123のどれでもないため、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;
}

この例では、score3なので、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
}

このenumswitch 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を使うと、01のような意味がわかりにくい値ではなく、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;
}

この例では、month8なので、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
}

enumswitch 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#では、casewhen句を付けて追加条件を書くことができます。

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;
}

この例では、score85なので、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#のパターンマッチングでは、関係パターンを使って範囲条件をより短く書くこともできます。andornotなどのパターンを組み合わせて条件を表現できます。

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;
}

この例では、data123が入っているため、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;
}

この例では、namenullなので、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文は、casebreakを使って処理を書きます。

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の最後にbreakreturnthrowなどを書いて、次の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;
}

この例では、stringobjectに含まれるため、先に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;
}

この場合、value1でも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 caseif文のどちらを使うか迷ったら、可読性を基準にしましょう。

たとえば、次のような場合は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だけを単独で使うことはできません。

caseswitch文の中で使うラベルです。

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;
}

この例では、score90でも先に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一致した値ごとの処理を書く
breakswitch文から抜ける
defaultどれにも一致しない場合を処理する

値の一致判定が多い場合はswitch case、複雑な条件式が多い場合はif文、値を返すだけならswitch式を使うと、読みやすく保守しやすいコードになります。

C#のswitch caseは、基本を覚えればすぐに実践で使える便利な条件分岐です。まずは数値や文字列の分岐から始め、慣れてきたらenumwhen句、パターンマッチング、switch式も活用していきましょう。