今回は、C#のswitch-case文で複数条件を分岐する方法についてご紹介します。
switch-case文とは
switch-case文は、指定した変数や式の値に応じて複数の処理を分岐させるための構文です。
if-else文を並べる場合に比べ、複数の分岐が発生するときにコードが整理されやすく、可読性が向上するというメリットがあります。
また、C#では複数のcaseをまとめたり、パターンマッチングを行ったりと、さまざまな方法で柔軟に条件分岐を表現できます。
switch-case文の基本的な構文
switch-case文の基本構造は以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
int value = 2; // 分岐の基準となる変数 switch (value) { case 1: Console.WriteLine("値は1です"); break; case 2: Console.WriteLine("値は2です"); break; default: Console.WriteLine("どの条件にも一致しません"); break; } |
値は2です
上記の例では、変数valueが2のため、case 2: のブロックが実行されます。
defaultはどのcaseにも当てはまらなかった場合に実行される分岐です。
複数のcaseをまとめる
同じ処理を行うcaseが複数ある場合は、それらを連続して書くことでまとめることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
int value = 1; // 1または2の場合に同じ処理を行う switch (value) { case 1: case 2: Console.WriteLine("値は1または2です"); break; case 3: Console.WriteLine("値は3です"); break; default: Console.WriteLine("その他の値です"); break; } |
値は1または2です
この例では、valueが1でも2でも同じブロックの処理が実行されます。
gotoを使ったフォールスルー
C#では、複数のcaseを段階的に処理したい場合、goto caseを使用してフォールスルーさせる方法があります。
ただし、コードの可読性を損ないやすいため、多用は避けることが推奨されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
int value = 2; // case 2 のあとに case 3 の処理も続けて実行 switch (value) { case 1: Console.WriteLine("値は1です"); break; case 2: Console.WriteLine("値は2です"); goto case 3; // フォールスルーで case 3 も実行 case 3: Console.WriteLine("case 2 から続けて実行される共通処理です"); break; default: Console.WriteLine("どれにも該当しません"); break; } |
値は2です
case 2 から続けて実行される共通処理です
パターンマッチングを用いた高度な分岐
C# 7.0以降では、switch-case文でのパターンマッチングが可能です。
型や条件に応じてより細やかな分岐を行えるため、複雑な条件でもコードがわかりやすくなる利点があります。
型に応じた分岐
オブジェクトの型をチェックしたい場合は、caseに型を記述するだけで簡単に判定できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
object obj = "Hello"; // 文字列が格納されている switch (obj) { case int i: Console.WriteLine("整数です: " + i); break; case string s: Console.WriteLine("文字列です: " + s); break; default: Console.WriteLine("その他の型または値です"); break; } |
文字列です: Hello
条件付きパターン(when節)の利用
パターンマッチングのcase節にwhenを用いると、同じ型でも特定条件に応じて分岐を細かく設定できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
int number = -3; // 負の整数 switch (number) { case int n when n > 0: Console.WriteLine("正の整数です"); break; case int n when n < 0: Console.WriteLine("負の整数です"); break; default: Console.WriteLine("0です"); break; } |
負の整数です
C# 8.0以降のswitch式
C# 8.0ではswitch文が式として利用できるようになり、複数の条件を簡潔に記述できます。
1 2 3 4 5 6 7 8 9 10 11 |
int score = 85; // スコアに応じて評価を判定 string grade = score switch { >= 90 => "A", >= 80 => "B", >= 70 => "C", _ => "F" }; Console.WriteLine("評価: " + grade); |
評価: B
C# 9.0以降ではさらに関係パターンや論理パターンも追加され、より柔軟な条件分岐が可能になっています。
注意点
switch-case文を活用する際に意識しておきたいポイントをまとめます。
- break文の付け忘れ:C#ではcaseの末尾にbreakを入れないとコンパイルエラーになります。意図しないフォールスルーを防ぐ意味でも必須です。
- 順序と可読性の確保:パターンマッチングを行う場合、上から順に条件が評価されます。より具体的な条件を前方に記述すると意図通りに動作しやすくなります。
- 複雑化の回避:複雑なロジックをswitch-case文に詰め込みすぎると可読性が低下します。場面によってはif-else文や他の設計パターンとの使い分けを検討してください。
まとめとして、switch-case文は複数条件を分岐する際に非常に便利な構文です。
基本的な使い方はシンプルですが、パターンマッチングなどの機能を使うと表現の幅が広がります。
用途に応じた方法を選択し、常にコードの可読性や保守性に気を配ることが大切です。