C# 8.0 以降では switch
文に加えて switch
式が導入され、より簡潔に条件分岐を記述できるようになりました。さらに C# 9.0 以降ではパターンマッチングが強化され、型・プロパティ・論理演算を組み合わせた柔軟な記述が可能です。本記事では switch
式でのパターンマッチング活用方法を紹介します。
基本的なswitch式
従来の switch
文と比べて、式として値を返せるのが特徴です。
int day = 2;
string result = day switch
{
0 => "日曜日",
1 => "月曜日",
2 => "火曜日",
_ => "不明"
};
Console.WriteLine(result); // 火曜日
型パターン
オブジェクトの型ごとに条件を分岐し、キャスト済みの変数をそのまま利用できます。
object obj = "Hello";
string desc = obj switch
{
int i => $"整数: {i}",
string s => $"文字列: {s}",
null => "null値",
_ => "その他"
};
Console.WriteLine(desc); // 文字列: Hello
プロパティパターン
オブジェクトのプロパティを使って条件分岐が可能です。オブジェクトの構造をそのまま条件として記述できます。
public class Person
{
public string Name { get; set; } = "";
public int Age { get; set; }
}
var person = new Person { Name = "Taro", Age = 20 };
string category = person switch
{
{ Age: < 13 } => "子供",
{ Age: >= 13 and < 20 } => "ティーン",
{ Age: >= 20 } => "大人",
_ => "不明"
};
Console.WriteLine(category); // 大人
論理パターン
and
・or
・not
を使うことで条件を論理的に組み合わせられます。
int number = 15;
string range = number switch
{
>= 1 and <= 10 => "1〜10の範囲",
> 10 and <= 20 => "11〜20の範囲",
not 100 => "100以外",
_ => "その他"
};
Console.WriteLine(range); // 11〜20の範囲
複合例:型+プロパティ+論理パターン
複数のパターンを組み合わせることで、複雑な条件も簡潔に書けます。
object obj = new Person { Name = "Hanako", Age = 17 };
string result = obj switch
{
Person { Age: < 13 } => "子供",
Person { Age: >= 13 and < 20 } => "ティーン",
string s when s.Length > 5 => $"長い文字列: {s}",
_ => "その他"
};
Console.WriteLine(result); // ティーン
まとめ
switch
式とパターンマッチングを活用することで、条件分岐を簡潔かつ表現力豊かに記述できます。
- 型パターン … 型ごとの分岐とキャストを自動で行える
- プロパティパターン … オブジェクトの中身で条件分岐可能
- 論理パターン … and / or / not を組み合わせて柔軟な条件を記述
C# 9 以降のモダンな構文を取り入れることで、可読性と保守性の高いコードが実現できます。