C# 模式匹配

大大只植物發表於2024-07-18

C# 使用模式匹配的好處,因為好用所以推薦~ - 萬雅虎 - 部落格園 (cnblogs.com) 具體可以看這篇文章 我主要是寫一下自己的看法

1.Object型別轉換

以往的Object型別轉換都是比較麻煩的 ,比如

            object obj = "20";
            var num = (int)obj;
            Console.WriteLine(num);

上述程式碼會報錯,而且在強型別語言裡都用上Object,基本代表你這個物件肯定不止一種型別

那麼有模式匹配後,你就可以這麼寫

            object obj = "20";
            if (obj is string s)
            {
                Console.WriteLine(s);
            }
            else if (obj is int num)
            {
                Console.WriteLine(num);
            }

或者用switch模式

            switch (obj)
            {
                case 0:
                    Console.WriteLine("數字 0");
                    break;
                case int num:
                    Console.WriteLine($"數字 {num}");
                    break;
                case string value:
                    Console.WriteLine($"字串 {value}");
                    break;
            }

2.物件的屬性進行模式匹配

開發中 我們經常會判斷物件是否null 寫法如下

            CheckListTagRelation data = null;//模擬方法返回這個物件 
            if (data != null && data.IsDelete == false && data.Grade == 4)
            {
                //操作
            }

程式碼量還挺多的,下面是物件的屬性進行模式匹配寫法,連null都給你隱式判斷了

            if(data is { IsDelete: false, Grade: 4 })
            {
                //操作
            }

Null判斷

            decimal? num = 2;
            if (num != null)
            {
                Console.WriteLine(num);
            }
            if (num is not null) 
            {
                //這樣寫和上面相比好處是 即使過載!=的運算 也不會影響
                Console.WriteLine(num);
            }

3.邏輯模式

            if (data != null &&( (data.Grade > 2&&data.Grade<10)||data.Grade<0))
            {
                //操作
            }
            if (data is { Grade: (> 6 and < 10) or < 0 })
            {
                //操作
            }

同樣先判斷非Null 然後再判斷 (Grade大於2與Grade<10)或者Grade<0 後面的寫法看起來就簡單多了

4.關係模式

這是一個傳入成績 ,返回評分的寫法,傳統的方式是這樣

string GetOldGrade(int grade)
{
    if (grade < 60)
    {
        return "不及格";
    }
    else if (grade < 70)
    {
        return "勉強及格";
    }
    else if (grade < 80)
    {
        return "良好";
    }
    else if (grade < 90)
    {
        return "優秀";
    }
    else if (grade < 100)
    {
        return "卓越";
    }
    else
    {
        return "天才";
    }
}

用了關係匹配後,程式碼量暴減

            string GetGrade(int grade) =>
                grade switch
                {
                    < 60 => "不及格",
                    < 70 => "勉強及格",
                    >= 70 and < 80 => "良好", //與寫法<80效果一樣 只是展示邏輯模式
                    < 90 => "優秀",
                    < 100 => "卓越",
                    _ => "天才",
                };

如果是物件,還可以這樣寫

            string GetGradeByClass(CheckListTagRelation data) =>
                data switch
                {
                    { IsDelete: false, Grade: < 60 } => "不及格",
                    { IsDelete: false, Grade: < 70 } => "勉強及格",
                    { IsDelete: false, Grade: >= 70 and < 80 } => "良好",
                    { IsDelete: false, Grade: < 90 } => "優秀",
                    { IsDelete: false, Grade: < 100 } => "卓越",
                    null=>"錯誤",
                    _ => "天才",
                };

相關文章