」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 模式是否與C#中基於類型的開關相匹配?

模式是否與C#中基於類型的開關相匹配?

發佈於2025-03-23
瀏覽:118

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

C#中的模式匹配是否優於傳統的基於類型的切換?

在C#等不支持直接“按類型切換”的語言中,程序員通常採用經典的“if...else if...else”結構來模擬基於類型的切換。然而,隨著涉及類型數量的增加,這種方法會變得冗長且脆弱。

C# 7及更高版本中的模式匹配

從C# 7開始,模式匹配提供了一種更優雅、更簡潔的按類型切換方式。 “case type”語法允許匹配變量的類型,有效地用特定模式的case替換了“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()運算符動態獲取類型名稱,用於switch語句。雖然不如模式匹配簡潔,但它為避免硬編碼類型名稱提供了一種更易於重構的替代方案。

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 if...else”結構。這種方法可能會變得笨拙且容易出錯。

void Foo(object o)
{
    if (o is A)
    {
        // 处理A类型
    }
    else if (o is B)
    {
        // 处理B类型
    }
    else
    {
        // 处理其他类型
    }
}

結論

C# 7及更高版本中的模式匹配提供了一種強大且簡潔的模擬基於類型切換的方法。它消除了對條件鏈的需求,提高了代碼可讀性,並降低了出錯的可能性。對於早期版本的C#,使用nameof()和switch語句提供了一種比硬編碼類型名稱更靈活的替代方案,而經典的“if...else if...else”結構仍然是一個不太理想但仍然可行的選擇。

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3