型パターンとプロパティパターン
形状とメンバーに基づいてマッチさせます。
「型パターンとプロパティパターン」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。
型パターン
型パターンは、入力が指定された型のインスタンスである場合に一致します。switchアーム内に型名だけを記述すると、値の実行時の型をテストできます。
これにより、扱いにくいisとキャストの連鎖を、型の絞り込みも自動的に行う、すっきりした1つの式によるチェックに置き換えられます。
object o = "hello";
string kind = o switch
{
int => "number",
string => "text",
_ => "unknown"
};
System.Console.WriteLine(kind);宣言パターン
宣言パターンでは、型の後ろに変数名を追加します。例: string s。一致すると、入力がキャストされ、その変数にバインドされます。
その後、アームの右辺で型付き変数を使用し、追加のキャストなしで、その型固有のメンバーにアクセスできます。
object o = "coddy";
string result = o switch
{
string s => $"len {s.Length}",
int n => $"value {n}",
_ => "other"
};
System.Console.WriteLine(result);実行可能な型による切り替え
型パターンは、object配列から値を解析する場合など、異種データの処理に最適です。
ここでは各要素を実行時の型で照合し、それに応じて書式設定します。バインドされた変数によって、絞り込まれた型を結果の式で使用できます。
using System;
class Program {
static string Describe(object o) => o switch {
int i => $"int {i}",
double d => $"double {d}",
string s => $"string '{s}'",
_ => "?"
};
static void Main() {
foreach (var x in new object[]{ 1, 2.5, "hi" })
Console.WriteLine(Describe(x));
}
}プロパティパターン
プロパティパターンでは、中かっこを使ってオブジェクトのメンバーを調べます。例: { Property: value }。指定した各プロパティが、内側のパターンを満たす場合に一致します。
これにより、メンバーを手動で比較することなく、オブジェクトの形状と内容に直接基づいて分岐できます。
record Person(string Name, int Age);
var p = new Person("Ada", 30);
string stage = p switch
{
{ Age: < 18 } => "minor",
{ Age: >= 65 } => "senior",
_ => "adult"
};
System.Console.WriteLine(stage);複数のプロパティ
中かっこの内側でコンマ区切りにすると、複数のプロパティを一度にテストできます。アームが実行されるには、すべてが一致する必要があります。
これにより、ステータスと特定の件数の両方を持つオブジェクトとの一致など、複合条件を明確に表現できます。
record Order(string Status, int Items);
var order = new Order("Open", 0);
string msg = order switch
{
{ Status: "Open", Items: 0 } => "empty cart",
{ Status: "Open" } => "shopping",
_ => "closed"
};
System.Console.WriteLine(msg);型パターンとプロパティパターンの組み合わせ
型パターンとプロパティパターンは組み合わせられます。型の後ろに、プロパティの中かっこブロックを記述します。入力がその型であり、かつプロパティが一致する場合にだけ、アームが一致します。
これは、基底クラスへの参照やインターフェイスを扱うときに便利です。具象サブタイプとその状態の両方に基づいて分岐できます。
using System;
abstract record Shape;
record Circle(double R) : Shape;
record Square(double Side) : Shape;
class Program {
static string Big(Shape s) => s switch {
Circle { R: > 10 } => "big circle",
Square { Side: > 10 } => "big square",
_ => "small"
};
static void Main() => Console.WriteLine(Big(new Circle(12)));
}入れ子になったプロパティパターン
プロパティパターンは入れ子にできます。プロパティ自体がオブジェクトの場合は、別の中かっこブロックでそのメンバーを照合します。
たとえば{ Address: { City: "Paris" } }を使うと、1つの式で2階層深くまで調べられます。これにより、nullになりやすいドットアクセスの連鎖を避けられます。
record Address(string City);
record User(string Name, Address Address);
var u = new User("Lin", new Address("Paris"));
bool inParis = u is { Address: { City: "Paris" } };
System.Console.WriteLine(inParis);拡張プロパティアクセス
C# 10以降では、プロパティパターン内でドット区切りのパスを使用できます。例: { Address.City: "Paris" }。これは入れ子になった中かっこの省略記法です。
これにより、照合中に中間の値も安全に処理しながら、深いチェックを読みやすい1行にまとめられます。
record Address(string City);
record User(string Name, Address Address);
var u = new User("Lin", new Address("Rome"));
string where = u switch
{
{ Address.City: "Paris" } => "FR",
{ Address.City: "Rome" } => "IT",
_ => "??"
};
System.Console.WriteLine(where);一致した値全体の取得
プロパティパターンの後ろに名前を追加すると、一致した値全体を変数にバインドできます。例: { Age: > 18 } adult。
その後、変数adultはアーム内のオブジェクト全体を参照します。プロパティがテストを通過したことを確認したうえで、そのオブジェクトを使用できます。
using System;
record Person(string Name, int Age);
class Program {
static void Main() {
Person p = new("Sam", 40);
string r = p switch {
{ Age: >= 18 } adult => $"{adult.Name} can vote",
_ => "too young"
};
Console.WriteLine(r);
}
}null の処理
プロパティパターンはnullには一致しません。調べるオブジェクトが存在しないためです。そのため、{ }(空の中かっこ)はnullでない任意の値に一致します。
このため、not nullと{ }はnullチェックに便利な定型表現であり、プロパティに基づくアームがnull入力を安全にスキップできるようにします。
string? maybe = null;
string state = maybe switch
{
null => "missing",
{ Length: 0 } => "empty",
_ => "has text"
};
System.Console.WriteLine(state);キャストよりパターンが優れている理由
パターンが登場する前は、型に基づく分岐にisチェック、その後のキャスト、nullガードが必要でした。型パターンとプロパティパターンを使えば、これらすべてを1つの式にまとめられます。
さらにコンパイラーは網羅性と到達可能性も追跡し、手書きのifチェーンでは見逃される到達不能なアームや不足しているケースを検出します。
object o = 42;
// Old: if (o is int) { int n = (int)o; ... }
// New:
if (o is int n) System.Console.WriteLine(n + 1);クイックチェック
型パターンとプロパティパターンについての理解度を確認しましょう。
まとめ
型パターンは実行時の型で一致し、型付き変数をバインドできます。プロパティパターンは{ Prop: pattern }を使ってメンバーを調べ、入れ子やドット区切りのパスにも対応します。また、nullには決して一致しません。
これらを組み合わせると、オブジェクトの形状と状態の両方に基づいて分岐できます。次は関係パターンと論理パターンを扱います。
よくある質問
「型パターンとプロパティパターン」レッスンは無料ですか?
はい。「型パターンとプロパティパターン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。
「型パターンとプロパティパターン」で何を学びますか?
形状とメンバーに基づいてマッチさせます。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「型パターンとプロパティパターン」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- switch式
- 型パターンとプロパティパターン
- 関係パターンと論理パターン
- リストパターンとタプルパターン