目次
はじめに
C#を学び始めて基本文法を理解した頃、ふと疑問に思うことがあります。
「この条件分岐、if文とswitch文どっちで書くべき?」
どちらを使っても同じ結果が得られる場面は多いですが、可読性や保守性を考えると、適材適所で使い分けることが重要です。本記事では、実務でも役立つ明確な判断基準を解説します。
if文の特徴と得意なケース
if文の基本的な特徴
if文は、任意の条件式(bool型を返す式)を評価できる柔軟な条件分岐です。
if (score >= 80)
{
Console.WriteLine("優秀");
}
else if (score >= 60)
{
Console.WriteLine("合格");
}
else
{
Console.WriteLine("不合格");
}
if文が適しているケース
1. 範囲や大小比較を行う場合
// 範囲判定はif文が自然
if (temperature < 0)
{
status = "氷点下";
}
else if (temperature < 25)
{
status = "快適";
}
else
{
status = "暑い";
}
2. 複数の異なる条件を組み合わせる場合
// 複合条件はif文の得意分野
if (user.IsActive && user.Age >= 18 && user.HasPermission)
{
AllowAccess();
}
3. 条件が2〜3個程度の単純な分岐
// シンプルな分岐ならif文で十分
if (isLoggedIn)
{
ShowDashboard();
}
else
{
ShowLoginPage();
}
switch文の特徴と得意なケース
switch文の基本的な特徴
switch文は、1つの値に対して複数の定数値との一致を判定する条件分岐です。
switch (dayOfWeek)
{
case DayOfWeek.Saturday:
case DayOfWeek.Sunday:
Console.WriteLine("休日");
break;
default:
Console.WriteLine("平日");
break;
}
switch文が適しているケース
1. 列挙型(enum)の値で分岐する場合
// enumとswitch文は相性抜群
switch (orderStatus)
{
case OrderStatus.Pending:
return "注文受付中";
case OrderStatus.Processing:
return "処理中";
case OrderStatus.Shipped:
return "発送済み";
case OrderStatus.Delivered:
return "配達完了";
default:
return "不明";
}
2. 特定の定数値との一致判定が4つ以上ある場合
// 分岐が多い場合、switch文の方が見通しが良い
switch (httpStatusCode)
{
case 200:
return "OK";
case 201:
return "Created";
case 400:
return "Bad Request";
case 401:
return "Unauthorized";
case 404:
return "Not Found";
case 500:
return "Internal Server Error";
default:
return "Unknown";
}
3. 文字列の完全一致で分岐する場合
switch (command.ToLower())
{
case "start":
StartProcess();
break;
case "stop":
StopProcess();
break;
case "restart":
RestartProcess();
break;
default:
ShowHelp();
break;
}
使い分けの判断基準まとめ
迷ったときは、以下の基準で判断してください。
| 判断ポイント | if文を選ぶ | switch文を選ぶ |
|---|---|---|
| 比較の種類 | 範囲・大小・複合条件 | 単一値との一致 |
| 分岐の数 | 2〜3個 | 4個以上 |
| 対象の型 | 任意 | 整数型、文字列、enum |
| 条件の関係性 | 条件同士が独立している | 1つの変数に対する分岐 |
判断フローチャート
- 範囲比較や複合条件か? → if文
- 1つの値の一致判定か? → 次へ
- 分岐が4つ以上あるか? → switch文
- enumの値か? → switch文
- 上記以外 → if文(シンプルな方を選ぶ)
【C# 8.0以降】switch式で更にスッキリ書く
C# 8.0で導入されたswitch式(switch expression)を使うと、より簡潔に書けます。
従来のswitch文
string GetGrade(int score)
{
switch (score / 10)
{
case 10:
case 9:
return "A";
case 8:
return "B";
case 7:
return "C";
default:
return "D";
}
}
switch式(C# 8.0以降)
string GetGrade(int score) => (score / 10) switch
{
10 or 9 => "A",
8 => "B",
7 => "C",
_ => "D"
};
switch式は値を返す式として使えるため、メソッドの戻り値や変数への代入がスッキリ書けます。
パフォーマンスの違いはあるのか?
「switch文の方が速い」という話を聞いたことがあるかもしれません。
結論から言えば、現代のC#コンパイラは高度に最適化されているため、通常のアプリケーション開発でパフォーマンス差を気にする必要はほとんどありません。
コンパイラは状況に応じて、switch文をジャンプテーブルに最適化したり、if-else連鎖に変換したりします。つまり、可読性と保守性を優先して選ぶべきです。
パフォーマンスが本当に重要な場面(1秒間に何百万回も呼ばれるようなホットパス)では、実際にベンチマークを取って判断してください。
よくある間違いと注意点
1. switch文でbreakを忘れない
C#では、各caseの末尾にbreak(またはreturn、throwなど)が必須です。
// コンパイルエラーになる
switch (value)
{
case 1:
DoSomething();
// break忘れ → エラー
case 2:
DoOther();
break;
}
2. switch文のdefaultは書く習慣をつける
想定外の値が来た場合の処理を明示することで、バグの早期発見につながります。
switch (status)
{
case Status.Active:
// 処理
break;
case Status.Inactive:
// 処理
break;
default:
throw new ArgumentOutOfRangeException(nameof(status));
}
まとめ
if文とswitch文の使い分けは、以下のポイントを押さえておけば迷いません。
- 範囲比較・複合条件 → if文
- 単一値の一致判定が多い → switch文
- enumの分岐 → switch文
- C# 8.0以降なら → switch式も検討
最も大切なのは、「このコードを半年後の自分や他の開発者が読んだとき、意図が伝わるか?」という視点です。可読性を意識した選択を心がけましょう。
