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

作者:WeihanLi 时间:2023-04-16 07:35:34 

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 '.')
 {
 }
}

// not
if (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

来源:https://www.cnblogs.com/weihanli/p/14226240.html

标签:C#9,模式匹配
0
投稿

猜你喜欢

  • JAVA设计模式之建造者模式原理与用法详解

    2022-09-25 19:43:04
  • C++11中的可变参数模板/lambda表达式

    2023-06-10 18:20:14
  • HTTP基本认证(Basic Authentication)的JAVA实例代码

    2022-06-08 13:03:32
  • 如何使用C#修改本地Windows系统时间

    2022-05-06 08:23:00
  • C++野指针和悬空指针的实现方法

    2022-11-02 08:26:56
  • Android为View添加拖放效果的方法实例

    2023-06-25 18:53:45
  • SpringBoot整合Shiro的代码详解

    2023-10-30 10:53:31
  • Java有哪些操作字符串的类?区别在哪?

    2021-06-02 14:50:54
  • Android ActionBar完全解析使用官方推荐的最佳导航栏(下)

    2022-04-27 02:35:03
  • java编写贪吃蛇小游戏

    2023-06-19 01:49:54
  • JetBrains发布java代码质量检测工具Qodana早期预览版

    2022-11-22 20:49:57
  • 基于springboot2集成jpa,创建dao的案例

    2021-08-02 00:40:46
  • Java Web开发过程中登陆模块的验证码的实现方式总结

    2022-01-29 19:33:16
  • Java 事务注解@Transactional回滚(try catch、嵌套)问题

    2021-05-29 17:54:43
  • java模拟hibernate一级缓存示例分享

    2023-06-18 08:43:55
  • Java中StringTokenizer的用法简介汇总

    2023-05-29 00:52:24
  • 详解SpringBoot中添加@ResponseBody注解会发生什么

    2023-07-02 22:08:13
  • Android 实现自定义圆形listview功能的实例代码

    2022-06-20 06:58:29
  • C#正则表达式实用大全(建议收藏!)

    2023-08-29 20:23:58
  • 描述C#多线程中lock关键字的使用分析

    2021-12-31 08:42:32
  • asp之家 软件编程 m.aspxhome.com