【C#】パターンマッチングの強化|switch式の活用

C# 8.0 以降ではパターンマッチング機能が大幅に強化され、従来の switch 文に加えて switch 式が利用できるようになりました。これにより、条件分岐をより簡潔に記述でき、可読性や保守性が向上します。本記事では switch 式の基本と実用的な使い方を解説します。

従来のswitch文

これまでは switch 文を使って値に応じた処理を記述していました。

string GetDayType(int day)
{
    switch (day)
    {
        case 0:
            return "日曜日";
        case 1:
            return "月曜日";
        case 2:
            return "火曜日";
        default:
            return "不明";
    }
}

しかしこの方法では冗長になりがちです。

switch式の基本構文

C# 8.0 以降では switch 式が導入され、より簡潔に記述できます。

string GetDayType(int day) => day switch
{
    0 => "日曜日",
    1 => "月曜日",
    2 => "火曜日",
    _ => "不明"
};

各パターンの結果を直接返すことができるため、コード量が大幅に減ります。

型パターンの活用

switch 式では型チェックとキャストを同時に行えます。

object value = 123;

string result = value switch
{
    int i => $"整数: {i}",
    string s => $"文字列: {s}",
    null => "null値",
    _ => "その他の型"
};

Console.WriteLine(result); // 整数: 123

プロパティパターン

オブジェクトのプロパティに基づいた条件分岐も可能です。

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

Person p = new Person { Name = "Taro", Age = 20 };

string category = p switch
{
    { Age: < 13 } => "子供",
    { Age: >= 13 and < 20 } => "ティーン",
    { Age: >= 20 } => "大人",
    _ => "不明"
};

Console.WriteLine(category); // 大人

論理パターン

andornot を使って論理演算を行うことも可能です。

int number = 15;

string desc = number switch
{
    >= 1 and <= 10 => "1から10の範囲",
    > 10 and <= 20 => "11から20の範囲",
    not 100 => "100以外",
    _ => "その他"
};

Console.WriteLine(desc); // 11から20の範囲

まとめ

C# のパターンマッチングは switch 式によって大幅に強化されました。

  • switch 式で分岐処理を簡潔に書ける
  • 型パターンで型判定とキャストを同時に行える
  • プロパティパターンや論理パターンで柔軟な条件分岐が可能

これらを活用することで、複雑な条件分岐もシンプルで読みやすいコードにできます。モダンな C# では積極的に switch 式を取り入れるのがベストプラクティスです。