0Pricing
C# Academy · レッスン

型パターンとプロパティパターン

形状とメンバーに基づいてマッチさせます。

「型パターンとプロパティパターン」は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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. switch式
  2. 型パターンとプロパティパターン
  3. 関係パターンと論理パターン
  4. リストパターンとタプルパターン
← C# Academyに戻る