Zenn
🗂

C# 8.0以降のswitch式で条件分岐をスッキリさせる

2025/02/08に公開

C# 8.0以降のswitch式で条件分岐をスッキリさせる

条件分岐はプログラミングで頻出する要素の一つですが、処理内容が増えるほどif-elseや従来のswitch文では可読性が低下しがちです。そこでC# 8.0以降で新たに導入されたswitch式を使うと、多数の分岐をコンパクトに記述でき、メンテナンス性も向上します。数値や文字列、さらにはパターンマッチングと組み合わせることで、多様な条件分岐をすっきりまとめられるのが特長です。本記事では、switch式の基本構文からパターンマッチングを駆使した応用までを詳しく解説していきます。

Unity初心者でも最短5日で3D FPSが完成!今すぐ始める入門チュートリアルはこちら

https://zenn.dev/ryuryu_game/books/fd28de9d8e963a/viewer/0570af

従来のswitch文の課題

C# 7以前のswitch文は、特定の値(整数や文字列など)をもとに分岐を行う代表的な構文でした。しかし、以下のような課題がありました。

  • 分岐が多くなるほどコードが縦に長くなる
  • ひとつのcaseに対してbreak;return;などを明示的に書かなければならない
  • パターンマッチングと連携しようとすると、ifis演算子を併用するため、コードが複雑化しやすい

例えば従来のswitch文は、次のような形になりがちです。

int score = 85;
string result;

switch (score)
{
    case int n when n >= 90:
        result = "A";
        break;
    case int n when n >= 70:
        result = "B";
        break;
    case int n when n >= 50:
        result = "C";
        break;
    default:
        result = "D";
        break;
}

whenキーワードを使うことでパターンマッチング的な条件を指定できますが、まだまだ冗長に感じる方も多いでしょう。そこで登場したのがC# 8.0以降で利用できるswitch式です。

switch式とは

switch式の基本構文

switch式は、値に応じて式全体の戻り値をひとまとめに決定できる新しい書き方です。上記のスコア判定をswitch式で書くと次のようになります。

int score = 85;

string result = score switch
{
    >= 90 => "A",
    >= 70 => "B",
    >= 50 => "C",
    _      => "D"
};

このように、式の中で直接条件と戻り値をセットで記述するため、可読性が高まります。また、switch式は式全体が値を返す構文なので、変数に代入するケースが多くなります。

https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/switch-expression

switch式のメリット

  • コード量の削減: caseラベルとbreak;の煩雑な書き方が不要
  • パターンマッチングとの融合がスムーズ: 条件式内で直接パターンを指定しやすい
  • 式として使える: 値を返すものなので、代入先をスッキリ書ける

さらに、switch式は型によるパターンマッチングタプルパターンなど、強力な拡張と組み合わせることで柔軟性を発揮します。

様々なパターンマッチング

数値範囲によるパターンマッチング

先ほどのスコア判定でも用いたように、switch式では数値範囲を直接記述できます。

int score = 95;

string grade = score switch
{
    >= 90 => "Sランク!",
    >= 70 => "Aランク",
    >= 50 => "Bランク",
    _ => "Cランク"
};

これにより、whenキーワードを書かなくても自然に条件分岐を定義できるため、コードが読みやすくなります。

タプルパターン

複数の値を同時にチェックしたいときはタプルを活用すると便利です。例えば「体力(hp)とステート(state)をまとめて判定する」といった場合に、switch式は非常に有用です。

(int hp, string state) characterStatus = (30, "Guard");

string action = characterStatus switch
{
    (<= 0, _) => "退場",
    (_, "Guard") => "防御中",
    (>= 50, _) => "突撃!",
    _ => "通常攻撃"
};

上記の例では、キャラクターのhpが0以下なら「退場」とみなして、そうでなければstateが"Guard"かどうかを判定する、という具合に複数の項目をまとめて判定できます。

型によるパターンマッチング

switch式と型パターンを組み合わせると、オブジェクトの型に応じた分岐をスマートに書けます。

object shape = new Rectangle(10, 5);

string shapeInfo = shape switch
{
    Circle c => $"円の半径は{c.Radius}です",
    Rectangle r => $"長方形の面積は{r.Width * r.Height}です",
    _ => "未知の形状"
};

shapeオブジェクトがCircleなのかRectangleなのかをswitch式で判定し、あらかじめキャストした状態でプロパティにアクセスできます。パターンマッチングの威力がより実感できるはずです。

switch式の実践テクニック

従来のswitch文との比較

switch式は「値を返すもの」であるため、従来のswitch文と根本的な使い方が少し異なります。ただし、本質的には「ある値や状態に応じて処理を分岐する」点で同じなので、移行はスムーズに行えます。複数のif-elseがズラッと並ぶ場面や、変数への代入が多重に行われる処理がある場面は、switch式に切り替えるとコードが大幅に見やすくなるでしょう。

switch式への移行ポイント
  • 代入処理をswitch式でまとめる
  • switch(expression) { ... }expression switch { ... } の形に書き換え
  • break; や return; は不要(式全体が値を返すため)

より詳しく知りたい方は以下の記事でも従来のswitch文とswitch式の違いが解説されています。
https://ufcpp.net/blog/2018/12/cs8switchexpr/

大規模プロジェクトへの適用

switch式は、条件分岐が多いデータ処理やゲームロジックなど、幅広い場面で活躍します。特にパターンマッチングを多用するシーンが多い場合に、switch式を導入するメリットは大きいと言えるでしょう。また、スコア計算や報酬判定など、ビジネスロジックやゲームシステムの核心部分で見通しが良くなるのは魅力です。

C# 8.0以降のswitch式のより高度な使い方、例えばプロパティパターンや位置パターンなどを網羅的に知りたい場合は、公式ドキュメントや以下の記事を参照すると理解が深まります。
https://zenn.dev/ktnd111/articles/9a6e001fe9ed8b

こちらの画像では、数値範囲パターンやタプルパターンなど、switch式をさまざまな角度から活用するコード例が掲載されているので、視覚的に理解しやすいでしょう。

switch式導入のメリット

  • 可読性向上: パターンマッチングを組み合わせてもコードがすっきり
  • バグを抑えやすい: 従来のswitch文のようにbreak;を忘れる心配がない
  • 柔軟性アップ: タプル・型・数値範囲・プロパティなど、複数のパターンを一箇所に集約しやすい
  • 移行が簡単: 既存のロジックを一括で書き直すのは大変ですが、部分的な置き換えからでも効果を実感しやすい

まとめ

switch式は、C# 8.0以降で推奨されるシンプルかつパワフルな条件分岐手法です。if-elseだらけになってしまう煩雑な分岐をすっきり書き換えられるため、可読性と拡張性が大幅に向上します。パターンマッチングとの組み合わせで多彩な判定を一括管理できる点も魅力です。

  • 数値範囲、タプル、型、プロパティなど、様々な条件分岐パターンに対応
  • 値を返す式として書けるので、スコープが明確
  • 大規模なコードベースでも安全に移行しやすい

例えば、複雑なゲームロジックや業務システムの条件分岐が「増えすぎて見通せない……」と困っている方は、switch式への移行を検討するだけで大きく状況が改善する可能性があります。さらに詳しくは、下記のリンクをあわせて確認してみてください。

https://zenn.dev/ktnd111/articles/9a6e001fe9ed8b
https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/switch-expression
https://ufcpp.net/blog/2018/12/cs8switchexpr/

これらの情報を活用して、ぜひ自分のプロジェクトにもswitch式を導入してみましょう。無駄を削ぎ落としたスッキリしたコードが書けるようになり、開発の効率と保守性が向上するはずです。

この記事を読んでもっと実践したいと感じたあなたへ

Unity開発を効率よく進めるためには、実践的なスキルと仲間との交流が欠かせません。
そんな方におすすめのステップが、下記の3つです。

1. 有料教材「どこでもUnity教室」でゲーム制作を短期マスター

  • 5日でシンプルなFPS完成:初心者向けに要点を押さえたカリキュラム
  • C#や最新のInputSystem、FPS実装まで網羅:つまずきやすいポイントを先回りで解説
  • 購入特典:Discord招待+サンプルプロジェクトDLで、疑問や実装例を即確認

Unity初心者でも最短5日で3D FPSが完成!今すぐ始める入門チュートリアルはこちら

https://zenn.dev/ryuryu_game/books/fd28de9d8e963a/viewer/0570af

2. 無料コミュニティで、疑問をすぐに解消&モチベーションUP

  • 初心者~中級者までOK:学習進度に合わせて質問や情報共有
  • 質問サポートが充実:わからないことを仲間や講師に即相談
  • 学習仲間と切磋琢磨:一緒に学ぶから続けやすい

Discordサーバー参加はこちら

https://discord.gg/5FwuKCacNy

3. 実績豊富な“ゲーム開発所RYURYU”があなたをトータルサポート

  • コナラ総販売200件超:さまざまなUnity開発の依頼を対応
  • VR/AR/AIなど最新技術にも精通:幅広いノウハウを活かして開発支援
  • ゲームクリエイター甲子園や東京ゲームショウなど出展実績多数

ご相談・お問い合わせはこちら

https://coconala.com/users/1772507

Discussion

ログインするとコメントできます