【C#】is演算子のパターンマッチング(and/or/not)で条件式を簡潔にする

C# 9.0 で強化されたパターンマッチングを利用すると、is 演算子を用いて、値の範囲チェックや null チェック、論理演算(かつ、または)を非常に直感的かつ簡潔に記述できるようになりました。

従来、&&|| を用いて繰り返していた変数記述を削減でき、英語の文章を読むように条件を記述できるのが特徴です。

本記事では、文字列の分類や数値の範囲判定を例に、新しい is 演算子の活用方法を解説します。

目次

実装例:論理パターンと関係パターン

以下のコードは、入力された文字(文字列)が特定の条件(英字または区切り文字)を満たすかどうかの判定、およびオブジェクトの null チェックを行う例です。

using System;

namespace PatternMatchingExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 1. 文字列のパターンマッチング
            // 辞書順での範囲比較(>= "a" and <= "z")や特定の値を判定
            string input = "Q";

            // 従来の書き方:
            // if ((input >= "a" && input <= "z") || (input >= "A" && input <= "Z") || input == "." || input == ",")
            
            // パターンマッチングを用いた書き方:
            bool isValidChar = input is (>= "a" and <= "z") 
                                     or (>= "A" and <= "Z") 
                                     or "." 
                                     or ",";

            Console.WriteLine($"文字 '{input}' は有効なパターンですか?: {isValidChar}");


            // 2. 数値の範囲チェック
            // 変数を繰り返さずに範囲を記述できる
            int temperature = 25;
            
            if (temperature is >= 20 and < 30)
            {
                Console.WriteLine("気温は快適な範囲(20度以上30度未満)です。");
            }


            // 3. nullチェック(notパターン)
            // "!= null" の代わりに使用可能。読みやすく、演算子オーバーロードの影響を受けないため安全。
            var position = new { X = 10, Y = 20 };

            if (position is not null)
            {
                Console.WriteLine($"座標データあり: X={position.X}, Y={position.Y}");
            }
        }
    }
}

解説

1. 論理パターン(Logical Patterns)

andornot というキーワードを使ってパターンを結合できます。

  • and: 両方のパターンに一致する場合(かつ)
  • or: いずれかのパターンに一致する場合(または)
  • not: パターンに一致しない場合(否定)

2. 関係パターン(Relational Patterns)

<><=>= などの比較演算子をパターンとして使用できます。これにより、variable >= min && variable <= max と書いていた範囲チェックを、variable is >= min and <= max と簡潔に記述できます。

3. nullチェックのベストプラクティス

is not null は、C# 9.0 以降における null チェックの推奨される記述方法の一つです。従来の != null と異なり、仮に対象のクラスで != 演算子がオーバーロードされていても、純粋に参照が null でないかを確認できるため、より安全で確実です。

まとめ

is 演算子の拡張により、複雑な条件式を宣言的で読みやすいコードに置き換えることができます。

  • 範囲チェック: x is >= 0 and <= 100
  • 除外チェック: y is not 0
  • 複合条件: c is 'A' or 'B'

特にバリデーション(入力値検証)ロジックにおいて、コードの可読性を大きく向上させるため、積極的に導入することをお勧めします。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次