プロパティ パターンを使用した表現力豊かな C# コード


C# は、F# にインスパイアされた機能で成長してきました.

最も興味深いのは Pattern Matching です.

パターン マッチングの導入により、プロパティ パターンが生まれました.

プロパティ パターンには注意が必要です.それらは C# 8 に含まれて以来、C# 9 だけでなく C# 10 でも改善され、進化してきました.

プロパティ パターンは、コードをより表現力豊かにする興味深い方法であり、この投稿ではその方法を説明します.

プロパティパターンとは



プロパティ パターンを使用して、式のプロパティをネストされたパターンに一致させます.

static bool IsFirstOfTheMonth(DateTime date) => date is { Day: 1 };


したがって、プロパティ パターンを使用すると、次のようになります.

private static (bool isValid, string reason) Validate(Note note)
{
    if (note == null)
        throw new ArgumentNullException(nameof(note));

    if (note.Title.Length < 5 || note.Title.Length > 50)
        return (false, "Title should be 5 to 50 char long");

    if (note.Content == null) 
        return (false, "Content is required");

    return (true, "");
}


これに:

private static (bool isValid, string reason) Validate(Note note)
    => note switch
    {
        { Title.Length: < 5 or > 50 } => (false, "Title should be 5 to 50 char long"),
        { Content: null } => (false, "Content is required"),
        null => throw new ArgumentNullException(nameof(note)),
        _ => (true, "")
    };


どこで使用できますか



プロパティ パターンが switch 式で使用されているのを見るのは一般的ですが、それだけに限定しないでください.

プロパティ パターンは、スイッチ ケース ガード、if、ブール代入、条件のキャッチなどのコンテキストで使用できます.

try
{
    //...
}
catch (NpgsqlException ex) when (ex is {Code: "42P01"})
{
    //...
}


ネストされたパターン



プロパティ パターンは、プロパティだけでなく、ネストされたプロパティのテストにも使用できます. C# 10 Extended property patterns を使用すると、さらに簡単になります.

if (person is Student { Address.CountryCode: "PT" })


優先順位



プロパティ パターンでは、「&&」、「||」は使用しません.または "!"の代わりに、"and"、"or"、"not"を使用できます.

括弧を使用して優先順位を指定することもできます.

person is Student ({ Address.CountryCode: "PT" } or { Address.CountryCode: "ES" }) and { Age: < 20}


まとめ



次回ブール式を記述する必要がある場合は、ここで学んだことを試してみてください.現時点では、これは C# コード ベースではそれほど一般的ではなく、必要な認知負荷が増加することを私は知っています.長年の C# 開発者であれば、コードの書き方は異なりますが、最終的には、コードはより表現力豊かになると思います.どう思いますか?

これがお役に立てば幸いです!このようなヒントをさらに得るには、私に従ってください.連絡を取り合いましょう!