「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > パターンは、C#の従来のタイプベースのスイッチングに代わる優れた代替品ですか?

パターンは、C#の従来のタイプベースのスイッチングに代わる優れた代替品ですか?

2025-03-23に投稿されました
ブラウズ:369

Is Pattern Matching a Superior Alternative to Traditional Type-Based Switching in C#?

パターンは、従来のタイプベースのスイッチングよりも優れていますか?

は、「タイプごとに直接スイッチ」をサポートしていないC#などの言語で、通常、クラシック「if ... else ... else」構造を使用してタイプベースのスイッチングをシミュレートします。ただし、関連するタイプの数が増えると、このアプローチは長く脆弱になります。

パターンマッチングC#7以降

C#7から始めて、パターンマッチングは、よりエレガントで簡潔なタイプで切り替える方法を提供します。 「ケースタイプ」構文は、変数の種類を一致させ、「if」ステートメントを特定のパターンの場合に効果的に置き換えることができます。

例えば:

void Foo(object o)
{
    switch (o)
    {
        case A a:    // 匹配A类型
            a.Hop();
            break;
        case B b:    // 匹配B类型
            b.Skip();
            break;
        default:
            throw new ArgumentException("意外类型: "   o.GetType());
    }
}

c#6を使用してnameof()

を使用して

C#6では、nameof()演算子を使用して、スイッチステートメントのタイプ名を動的に取得できます。パターンマッチングほど簡潔ではありませんが、ハードコーディングされたタイプ名を避けるための簡単な代替手段を提供します。

void Foo(object o)
{
    switch (o.GetType().Name)
    {
        case nameof(A):
            // 处理A类型
            break;
        case nameof(B):
            // 处理B类型
            break;
        default:
            // 处理其他类型
            break;
    }
}

C#5以前の

のタイプベースのスイッチ

C#5以前には、ハードコードされたタイプ名を持つ基本的な「if ... else ... else ... else ... else ... else」構造を使用する以外に選択肢がありません。このアプローチは不器用でエラーが発生しやすくなる可能性があります。
void Foo(object o)
{
    if (o is A)
    {
        // 处理A类型
    }
    else if (o is B)
    {
        // 处理B类型
    }
    else
    {
        // 处理其他类型
    }
}

結論は

C#7以降のパターンマッチングは、タイプベースのスイッチングをシミュレートするための強力で簡潔な方法を提供します。条件付きチェーンの必要性を排除し、コードの読みやすさを向上させ、エラーの可能性を減らします。 c#の以前のバージョンの場合、nameof()とswitchステートメントを使用して、ハードコーディングされたタイプ名よりも柔軟な代替品が提供され、クラシックな「if ... else ... else ... else ... else」構造はまだ理想的ではありませんが、実行可能なオプションです。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3