【Unity】C#のパターン マッチングを使ってみる

これまでのパターンマッチングを使わない方法と使った方法を見比べて学習に結びつけましょう
サンプルはUnityでのスクリプトを想定しています
もちろん、C#コンソールアプリでテストすることもできます

if文を使ったサンプル

基本となるコードです
日付から四季のいずれに当たるかを得るコードになります

using UnityEngine;
using System;

public class CalendarSeason : MonoBehaviour
{
    // 与えられた日付に対する季節を返すメソッド
    public string GetSeasonForDate(DateTime date)
    {
        int month = date.Month;

        if (month >= 3 && month <= 5)
        {
            return "春";
        }
        else if (month >= 6 && month <= 8)
        {
            return "夏";
        }
        else if (month >= 9 && month <= 11)
        {
            return "秋";
        }
        else if (month == 12 || (month >= 1 && month <= 2))
        {
            return "冬";
        }
        else
        {
            // 予期しない月の日付の場合
            throw new ArgumentOutOfRangeException(nameof(date), $"無効な月: {month}.");
        }
    }

    // テストの例を実行するためのメソッド
    private void Start()
    {
        DateTime testDate = new DateTime(2023, 4, 15);
        string season = GetSeasonForDate(testDate);

        // 結果をデバッグコンソールに出力
        Debug.Log($"{testDate:yyyy年MM月dd日} の季節: {season}");
    }
}

2023年04月15日 の季節: 春

このコードは、与えられた日付から季節を判定するUnityのC#プログラムです。GetSeasonForDate メソッドは、渡された日付の月を取得し、条件に応じて春、夏、秋、冬のいずれかの季節を文字列で返します。月に応じた条件分岐を使用し、無効な月が渡された場合には例外をスローします。Start メソッドでは、テスト日付を設定し、季節を取得してデバッグコンソールに結果を表示します。このコードは初学者向けに理解しやすく、日付から季節を簡単に判定できるツールとして役立ちます。

Switch文を使ったサンプル

上記、if文をswitch文に置き換えてサンプルになります
これも使われる方法ですね

using UnityEngine;
using System;

public class CalendarSeason : MonoBehaviour
{
    public string GetSeasonForDate(DateTime date)
    {
        int month = date.Month;
        string season;

        switch (month)
        {
            case 3:
            case 4:
            case 5:
                season = "春";
                break;
            case 6:
            case 7:
            case 8:
                season = "夏";
                break;
            case 9:
            case 10:
            case 11:
                season = "秋";
                break;
            case 12:
            case 1:
            case 2:
                season = "冬";
                break;
            default:
                throw new ArgumentOutOfRangeException(nameof(date), $"無効な月: {month}.");
        }

        return season;
    }

    private void Start()
    {
        DateTime testDate = new DateTime(2023, 4, 15);
        string season = GetSeasonForDate(testDate);
        Debug.Log($"{testDate:yyyy年MM月dd日} の季節: {season}");
    }
}

C# 8.0以降のパターンマッチング1

C# 8.0以降では、パターンマッチングを使用してよりシンプルで効率的なコードを書くことができます。以下は、C# 8.0以降でのパターンマッチングを使用したコードです

using UnityEngine;
using System;

public class CalendarSeason : MonoBehaviour
{
    public string GetSeasonForDate(DateTime date)
    {
        return date.Month switch
        {
            3 or 4 or 5 => "春",
            6 or 7 or 8 => "夏",
            9 or 10 or 11 => "秋",
            12 or 1 or 2 => "冬",
            _ => throw new ArgumentOutOfRangeException(nameof(date), $"無効な月: {date.Month}."),
        };
    }

    private void Start()
    {
        DateTime testDate = new DateTime(2023, 4, 15);
        string season = GetSeasonForDate(testDate);
        Debug.Log($"{testDate:yyyy年MM月dd日} の季節: {season}");
    }
}

このコードでは、switch 文内でパターンマッチングを使用して、各月に対応する季節を簡潔に指定しています。無効な月の場合には例外がスローされます

C# 8.0以降のパターンマッチング2

&&はand、||はorで置き換えることもできるようになりました

using UnityEngine;
using System;

public class CalendarSeason : MonoBehaviour
{
    public string GetSeasonForDate(DateTime date)
    {
        string season = date.Month switch
        {
            >= 3 and <= 5 => "春",
            >= 6 and <= 8 => "夏",
            >= 9 and <= 11 => "秋",
            12 or >= 1 and <= 2 => "冬",
            _ => throw new ArgumentOutOfRangeException(nameof(date), $"無効な月: {date.Month}."),
        };

        return season;
    }

    private void Start()
    {
        DateTime testDate = new DateTime(2023, 4, 15);
        string season = GetSeasonForDate(testDate);
        Debug.Log($"{testDate:yyyy年MM月dd日} の季節: {season}");
    }
}

このコードでは、switch 文内でパターンマッチングを使用して、各月に対応する季節を簡潔に指定しています。無効な月の場合には例外がスローされます。

C# 8.0以降のパターンマッチング3

&&はand、||はorで置き換えることもできるようになりました

using UnityEngine;
using System;

public class CalendarSeason : MonoBehaviour
{
    public string GetSeasonForDate(DateTime date)
    {
        int month = date.Month;

        string season = month switch
        {
            3 or 4 or 5 => "春",
            6 or 7 or 8 => "夏",
            9 or 10 or 11 => "秋",
            12 or 1 or 2 => "冬",
            _ => throw new ArgumentOutOfRangeException(nameof(date), $"無効な月: {month}."),
        };

        return season;
    }

    private void Start()
    {
        DateTime testDate = new DateTime(2023, 4, 15);
        string season = GetSeasonForDate(testDate);
        Debug.Log($"{testDate:yyyy年MM月dd日} の季節: {season}");
    }
}

直接リターンすることもできます

using UnityEngine;
using System;

public class CalendarSeason : MonoBehaviour
{
    public string GetSeasonForDate(DateTime date)
    {
        return date.Month switch
        {
            3 or 4 or 5 => "春",
            6 or 7 or 8 => "夏",
            9 or 10 or 11 => "秋",
            12 or 1 or 2 => "冬",
            _ => throw new ArgumentOutOfRangeException(nameof(date), $"無効な月: {date.Month}."),
        };
    }

    private void Start()
    {
        DateTime testDate = new DateTime(2023, 4, 15);
        string season = GetSeasonForDate(testDate);
        Debug.Log($"{testDate:yyyy年MM月dd日} の季節: {season}");
    }
}

このコードのメリット

このコードのメリットは次のとおりです:

  1. シンプルで読みやすい: パターンマッチングを使用することで、月ごとの条件分岐が非常にシンプルで読みやすくなり、ソースコードが簡潔になります。
  2. コードの保守性向上: 月ごとの条件を列挙することで、将来的な変更や修正が容易になり、コードの保守性が向上します。
  3. エラーハンドリング: 無効な月が与えられた場合には例外をスローするため、問題の早期発見が容易になります。
  4. カスタマイズ性: 条件分岐を変更することで、季節の定義をカスタマイズできます。新しい条件を簡単に追加したり、既存の条件を変更したりできます。
  5. デバッグ情報: デバッグログを使用して、計算された季節を表示することで、プログラムの正確性を確認しやすくなります。
  6. C# 8.0の新機能の活用: パターンマッチングはC# 8.0で導入された新しい機能であり、モダンなC#の機能を活用しています。

参考