C#のパターンマッチングの基本!switch文の進化系を理解しよう
生徒
「C#のswitch文って知ってますけど、最近はもっと進化した使い方があるって聞きました。どういうことですか?」
先生
「良いところに目をつけましたね!最近のC#では『パターンマッチング』という機能を使って、switch文がもっと柔軟に使えるようになったんですよ。」
生徒
「それは便利そうですね!どうやって使うんですか?」
先生
「それでは、C#のパターンマッチングと進化したswitch文の基本を一緒に学んでいきましょう!」
1. パターンマッチングとは?
パターンマッチング(Pattern Matching)とは、「値がどんな形をしているか」「どの型に当てはまるか」などを判定して、それに応じた処理を行う方法のことです。
従来のswitch文は、「特定の値と一致しているか」を見るだけでしたが、C# 7.0以降では、型判定やnullチェック、条件つき分岐など、より細かい判定ができるようになりました。
2. 型パターンを使ったswitch文の書き方
パターンマッチングの一つに「型パターン」があります。これは、ある値が特定の型かどうかを調べて、その型で処理を行うものです。
以下の例では、object型の変数にいろいろな型の値が入っているとして、それぞれの型に応じたメッセージを表示します。
object value = 123;
switch (value)
{
case int i:
Console.WriteLine($"整数です: {i}");
break;
case string s:
Console.WriteLine($"文字列です: {s}");
break;
case null:
Console.WriteLine("値はnullです");
break;
default:
Console.WriteLine("その他の型です");
break;
}
整数です: 123
3. 条件パターン(when句)を使ってさらに詳しく分ける
さらに細かく条件を分けたいときは、when句を使うことで、値に対して追加の条件をつけることができます。
object value = 75;
switch (value)
{
case int i when i < 50:
Console.WriteLine("50未満の整数です");
break;
case int i when i >= 50 && i <= 100:
Console.WriteLine("50以上100以下の整数です");
break;
case int i:
Console.WriteLine("100より大きい整数です");
break;
default:
Console.WriteLine("整数以外の値です");
break;
}
50以上100以下の整数です
4. 複数のパターンをまとめて書く「ORパターン」
C# 9.0からは、「ORパターン(またはパターン)」が使えるようになり、複数の条件をorでまとめて判定できるようになりました。
char c = 'A';
switch (c)
{
case 'A' or 'E' or 'I' or 'O' or 'U':
Console.WriteLine("母音です");
break;
default:
Console.WriteLine("子音です");
break;
}
母音です
5. switch式を使ってもっと簡潔に書く
C# 8.0からは、switchを式として使えるswitch式が導入されました。これを使うと、よりシンプルで読みやすいコードを書くことができます。
int score = 85;
string result = score switch
{
>= 90 => "とても良い",
>= 70 => "良い",
>= 50 => "ふつう",
_ => "がんばろう"
};
Console.WriteLine(result);
良い
このように、switch式では=>を使って「条件 → 処理内容」という形で書けるので、分かりやすくなっています。
6. パターンマッチングの活用シーン
パターンマッチングは、以下のような場面で活躍します:
- オブジェクトの型によって処理を切り替えるとき
- nullや特定の条件を含む複雑な分岐が必要なとき
- switch式で短く、読みやすいコードを書きたいとき
初心者でも、型やnullのチェックなどが簡単に書けるので、ぜひ使いこなせるように練習してみましょう。
まとめ
C#のパターンマッチングは、従来のswitch文をさらに柔軟に、そして読みやすく進化させた機能です。型の判定だけでなく、nullの扱いや条件付きの分岐、さらに複数条件をまとめて書けるorパターン、そしてswitch式による簡潔な記述まで、近年のC#は非常に表現力豊かな言語へと成長しています。
特に、object型のように中身の型が不明な変数を安全に扱いたい場面では、型パターンが大活躍します。しかも、when句を使えば追加の条件も加えられるので、実務でも「型と条件で処理を分けたい」というニーズにぴったり応えてくれます。
また、orパターンの導入によって、例えば複数の文字をひとまとめにチェックする場面などではコードが劇的に読みやすくなります。さらに、switch式を活用すれば、変数への代入処理も簡潔に行えるようになり、プログラム全体の見通しが良くなります。
このように、パターンマッチングは単なる文法の拡張にとどまらず、保守性の向上やバグの減少にもつながる、重要な機能です。まだ使ったことがない方も、ぜひ簡単なサンプルから慣れていきましょう。
switch式の活用例
ここでは、パターンマッチングとswitch式を組み合わせた応用的な例を紹介します。
object item = 42;
string description = item switch
{
int i when i % 2 == 0 => "偶数の整数です",
int i => "奇数の整数です",
string s => $"文字列:{s}",
null => "値はnullです",
_ => "その他の型です"
};
Console.WriteLine(description);
偶数の整数です
この例では、int型かつ偶数という条件をwhenで分岐しています。
型と条件を組み合わせることで、より精密なロジックを短く表現できるのが特徴です。
生徒
「先生、C#のswitch文って、昔はただの値の比較しかできないと思ってました。でも、今は型や条件で分けられるんですね!」
先生
「その通りです。特にwhen句やswitch式を使うと、ずいぶんスッキリしたコードになりますよね。」
生徒
「型のチェックとか、nullの扱いがすごく自然に書けるのが驚きでした。実務でよく使う場面が多そうです。」
先生
「まさにそうです。Webアプリの入力バリデーションや、APIのレスポンス処理なんかでも、パターンマッチングはよく使われます。」
生徒
「ORパターンも便利ですね。母音かどうかの判定とか、これまではif文で書いてたところが短く書けました。」
先生
「C#は毎回のバージョンアップで確実に書きやすくなっています。ぜひこの機会に、パターンマッチングを自分のコードに取り入れてみましょう。」