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=>"错误", _ => "天才", };
标签:Console,C#,grade,Grade,num,WriteLine,data,模式匹配 From: https://www.cnblogs.com/czb071/p/18309738