このシリーズも気がつけば第5弾。
今回は、C#の条件分岐をさらに進化させる「when節」と、パターンマッチングの組み合わせ技を紹介します。
これまで紹介してきた switch式
や is
パターンだけでも十分便利でしたが、「条件付きでパターンマッチしたい」場面では、この when
が輝きます。
そもそも when 節って何?
when
は switch
文や 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式の意味を解説します。
person
がStudent型
かつGrade >= 80
→"Honor student"
person
がStudent
型(条件なし)→"Regular student"
- その他 →
"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(...)
など、よく使うけど、意外と曖昧に書いてる部分を整理していきます。
それではまた、よりスッキリとした分岐の世界でお会いしましょう。