C# 模式匹配

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=>"错误",
                    _ => "天才",
                };
复制代码

 

posted @   大大只植物  阅读(79)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示