C# 従来構文 vs. パターン構文 ― 使い分けガイド

1. そもそも「従来構文」「パターン構文」とは?

用語概要主なキーワード
従来構文if / else if / switch に論理演算子 (&&, `
パターン構文パターン マッチング を用いて「値の形」を検査し、追加の束縛(変数への代入)や ガード(when 句)を行う新しい書き方。is, switch, switch expression, relational / logical / list patterns

2. 代表的な書き方の比較

観点従来構文パターン構文
読みやすさ条件が複雑になるほどカッコと演算子が増えがち“〇〇なら許可/それ以外禁止” の形で宣言的に書ける
重複コード複数の if で同じ対象を何度も書きやすい1 回値を書いて複数条件を連鎖しやすい (switch式)
型チェックobj is int ⇒ 直後にキャストobj is int v and >= 0 の 1 行で完結
範囲チェックx >= 0 && x <= 9x is >= 0 and <= 9
null 許容参照if (s != null && s.Length > 0)if (s is { Length: > 0 })
配列/コレクションループや Length → ifarr is [1, .., >0] (C# 12 list pattern)
C# バージョンすべてのバージョン機能ごとに C# 7~12 が必要
パフォーマンス同等 (コンパイル後 IL は類似)同等。可読性向上が主目的

3. コード例で見る「差」

3-1 整数の範囲チェック

従来構文

if (0 <= x && x <= 9) 
{
    Console.WriteLine("0〜9");
}

パターン構文 (relational + logical pattern, C# 9)

if (x is >= 0 and <= 9) 
{
    Console.WriteLine("0〜9");
}

3-2 型判定+追加条件

従来構文

if (obj is int) 
{
    var v = (int)obj;
    if (v >= 0) Console.WriteLine(v);
}

パターン構文 (type pattern + relational pattern)

if (obj is int v and >= 0) 
{
    Console.WriteLine(v);
}

3-3 switch での宣言的分岐

従来構文

switch (c) 
{
    case 'a':
    case 'e':
    case 'i':
    case 'o':
    case 'u':
        kind = "Vowel";
        break;
    default:
        kind = "Consonant";
        break;
}

パターン構文 (switch expression, C# 8)

string kind = c switch 
{
    'a' or 'e' or 'i' or 'o' or 'u' => "Vowel",
    _                               => "Consonant"
};

4. いつパターン構文を採用すべきか?

ケース推奨構文理由
① 1 つの値に複数条件を当てはめるパターンswitch expression同一値を 1 度しか書かず保守性が高い
② 型分岐+追加条件があるパターンキャストを省略でき、null 安全も強化
③ コレクションの形を検査パターン (list pattern)Length・添字比較より宣言的
④ 簡単な単条件従来構文シンプルさ優先、学習コスト不要
⑤ 高性能が最優先ポイントどちらでも可IL 生成はほぼ同等、可読性で選ぶ

5. 移行時の注意点

  1. 導入バージョンを確認
    • プロジェクトが C# 9 未満ならリレーショナル パターンは使用不可。
    • Unity(現行 LTS)は C# 10 相当で list pattern がまだ使えない、など。
  2. 優先順位を明示and が or より高い。複雑な条件は括弧で意図を示す。
// 意図がブレない例
if (x is (>= 0 and <= 9) or 99) { … }
  1. switch 落とし穴
    • switch 文では上から順番に判定、switch expression では網羅性チェックが走る。
    • default: と _ は最後に置いて、意図せぬマッチを防ぐ。
  2. パフォーマンス計測条件が 1 万回/フレーム以上呼ばれる箇所では、念のため BenchmarkDotNet などで IL & JIT を実測してから採用判断を。

6. まとめ

  • 宣言的に書けて読みやすい → パターン構文
  • 歴史的資産・単純条件 → 従来構文
  • 最終判断基準は “可読性と保守性”。チームの C# バージョン・経験値・コードレビュー方針に合わせて徐々に移行しましょう。

Tip: 「条件が“句読点”ではなく“文章”になってきたらパターンを検討する」——この感覚で書き分けると、どちらも冗長になりません。

訪問数 3 回, 今日の訪問数 1回