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 <= 9 | x is >= 0 and <= 9 |
null 許容参照 | if (s != null && s.Length > 0) | if (s is { Length: > 0 }) |
配列/コレクション | ループや Length → if | arr 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. 移行時の注意点
- 導入バージョンを確認
- プロジェクトが C# 9 未満ならリレーショナル パターンは使用不可。
- Unity(現行 LTS)は C# 10 相当で list pattern がまだ使えない、など。
- 優先順位を明示and が or より高い。複雑な条件は括弧で意図を示す。
// 意図がブレない例
if (x is (>= 0 and <= 9) or 99) { … }
- switch 落とし穴
- switch 文では上から順番に判定、switch expression では網羅性チェックが走る。
- default: と _ は最後に置いて、意図せぬマッチを防ぐ。
- パフォーマンス計測条件が 1 万回/フレーム以上呼ばれる箇所では、念のため BenchmarkDotNet などで IL & JIT を実測してから採用判断を。
6. まとめ
- 宣言的に書けて読みやすい → パターン構文
- 歴史的資産・単純条件 → 従来構文
- 最終判断基準は “可読性と保守性”。チームの C# バージョン・経験値・コードレビュー方針に合わせて徐々に移行しましょう。
Tip: 「条件が“句読点”ではなく“文章”になってきたらパターンを検討する」——この感覚で書き分けると、どちらも冗長になりません。
訪問数 3 回, 今日の訪問数 1回
ディスカッション
コメント一覧
まだ、コメントがありません