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=>"錯誤", _ => "天才", };