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)
and、or、not というキーワードを使ってパターンを結合できます。
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'
特にバリデーション(入力値検証)ロジックにおいて、コードの可読性を大きく向上させるため、積極的に導入することをお勧めします。
