博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 9 新特性 —— 增强的模式匹配
阅读量:4033 次
发布时间:2019-05-24

本文共 2669 字,大约阅读时间需要 8 分钟。

C# 9 新特性 —— 增强的模式匹配

Intro

C# 9 中进一步增强了模式匹配的用法,使得模式匹配更为强大,我们一起来了解一下吧

Sample

C# 9 中增强了模式匹配的用法,增加了 and/or/not 操作符,而且可以直接判断属性,来看一下下面的这个示例:

var person = new Person();// or// string.IsNullOrEmpty(person.Description)if (person.Description is null or { Length: 0 }){    Console.WriteLine($"{nameof(person.Description)} is IsNullOrEmpty");}// and// !string.IsNullOrEmpty(person.Name)if (person.Name is not null and { Length: > 0 }){    if (person.Name[0] is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z') or '.')    {    }}// notif (person.Name is not null){}

这里的代码使用 DnSpy 反编译之后的代码是下面这样的:

Person person = new Person();string text = person.Description;bool flag = text == null || text.Length == 0;if (flag){    Console.WriteLine("Description is IsNullOrEmpty");}text = person.Name;bool flag2 = text != null && text.Length > 0;if (flag2){    char c = person.Name[0];    if (c >= 'a')    {        if (c > 'z')        {            goto IL_8B;        }    }    else if (c >= 'A')    {        if (c > 'Z')        {            goto IL_8B;        }    }    else if (c != ',' && c != '.')    {        goto IL_8B;    }    bool flag3 = true;    goto IL_8E;    IL_8B:    flag3 = false;    IL_8E:    bool flag4 = flag3;    if (flag4)    {    }}bool flag5 = person.Name != null;if (flag5){}

Switch

这不仅适用于 is 也可以在 switch 中使用

switch (person.Age){    case >= 0 and <= 3:        Console.WriteLine("baby");        break;    case > 3 and < 14:        Console.WriteLine("child");        break;    case > 14 and < 22:        Console.WriteLine("youth");        break;    case > 22 and < 60:        Console.WriteLine("Adult");        break;    case >= 60 and <= 500:        Console.WriteLine("Old man");        break;    case > 500:        Console.WriteLine("monster");        break;}

反编译后的代码:

int age = person.Age;int num = age;if (num < 22){    if (num < 14)    {        if (num >= 0)        {            if (num > 3)            {                Console.WriteLine("child");            }            else            {                Console.WriteLine("baby");            }        }    }    else if (num > 14)    {        Console.WriteLine("youth");    }}else if (num < 60){    if (num > 22)    {        Console.WriteLine("Adult");    }}else if (num > 500){    Console.WriteLine("monster");}else{    Console.WriteLine("Old man");}

More

可以看到有些情况下可以简化不少代码,尤其是 if 分支比较多的情况下使用上面 switch 这样的写法会清晰很多

但是如果只是 string.IsNullOrEmpty 这种代码最好还是不要写得这么骚了,小心要被同事吐槽了

炫技需谨慎,小心被 ...

Reference

  • https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9

  • https://github.com/WeihanLi/SamplesInPractice/tree/master/CSharp9Sample

  • https://github.com/WeihanLi/SamplesInPractice/blob/master/CSharp9Sample/PatternMatchingSample.cs

转载地址:http://muudi.baihongyu.com/

你可能感兴趣的文章
android raw读取超过1M文件的方法
查看>>
ubuntu下SVN服务器安装配置
查看>>
MPMoviePlayerViewController和MPMoviePlayerController的使用
查看>>
CocoaPods实践之制作篇
查看>>
[Mac]Mac 操作系统 常见技巧
查看>>
苹果Swift编程语言入门教程【中文版】
查看>>
捕鱼忍者(ninja fishing)之游戏指南+游戏攻略+游戏体验
查看>>
iphone开发基础之objective-c学习
查看>>
iphone开发之SDK研究(待续)
查看>>
计算机网络复习要点
查看>>
Variable property attributes or Modifiers in iOS
查看>>
NSNotificationCenter 用法总结
查看>>
C primer plus 基础总结(一)
查看>>
剑指offer算法题分析与整理(一)
查看>>
剑指offer算法题分析与整理(三)
查看>>
部分笔试算法题整理
查看>>
Ubuntu 13.10使用fcitx输入法
查看>>
pidgin-lwqq 安装
查看>>
mint/ubuntu安装搜狗输入法
查看>>
C++动态申请数组和参数传递问题
查看>>