【Unity×C#】省略形シリーズ第五弾:when節とパターンマッチの合わせ技

Unity

このシリーズも気がつけば第5弾。
今回は、C#の条件分岐をさらに進化させる「when節」と、パターンマッチングの組み合わせ技を紹介します。

これまで紹介してきた switch式is パターンだけでも十分便利でしたが、「条件付きでパターンマッチしたい」場面では、この when が輝きます。

そもそも when 節って何?

whenswitch 文や switch式 のケースに追加の条件を付けるための節です。
「この型だけど、さらにこういう条件のときだけ」――そんなときに活躍します。

🗂️ 普通バージョン

if (person is Student)
{
    var student = (Student)person;
    if (student.Grade >= 80)
    {
        Console.WriteLine("Honor student");
    }
}

オブジェクトpersonがStudent型の場合、ローカル変数studentにキャストしてからGradeの値を調べ、80以上なら「名誉生徒」であると出力する。
これ、読み慣れていれば問題ありませんが、型チェック+キャスト+条件の組み合わせでネストが深くなります。

👑パターン+when節で書き直したバージョン

string GetStudentStatus(object person) => person switch
{
    Student s when s.Grade >= 80 => "Honor student",
    Student => "Regular student",
    _ => "Not a student"
};

このswitch式の意味を解説します。

  1. personStudent型 かつ Grade >= 80"Honor student"
  2. personStudent型(条件なし)→ "Regular student"
  3. その他 → "Not a student"

順に条件を評価し、最初にマッチしたものが適用されます。

注意点とポイント

  • when後出し条件です。まずパターンマッチしてから、追加条件を評価します。
  • switch式 では順番が重要。上に書いた条件が優先されます。
  • if文に比べて意図が明確になることが多いですが、複雑になりすぎると逆に読みにくくなることもあります。

まとめ

処理内容普通の書き方パターン+whenで書くと
型チェック+条件if (x is T t && 条件)同左(パターン内で完結)
switchで条件を分けたいswitch { case T t: if(条件) return ... }T t when 条件 => 値

次回予告:LINQとラムダにも潜む、省略形の誘惑

次回は、if を離れて、LINQクエリやラムダ式に登場する省略形をピックアップ予定です。
Where(x => ...)Select(...) など、よく使うけど、意外と曖昧に書いてる部分を整理していきます。

それではまた、よりスッキリとした分岐の世界でお会いしましょう。

タイトルとURLをコピーしました