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

 更新时间:2021年01月04日 09:30:30   作者:WeihanLi  
这篇文章主要介绍了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 '.')
  {
  }
}

// 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

到此这篇关于C#9新特性之增强的模式匹配的文章就介绍到这了,更多相关C#9 模式匹配内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#操作INI文件的方法详解

    C#操作INI文件的方法详解

    INI文件全称是Initialization File的缩写,即初始化文件,是windows系统的系统配置文件所采用的存储格式,统管windows的各项配置。本文介绍了C#操作INI文件的方法,需要的可以参考一下
    2022-10-10
  • C# 泛型接口的抗变和协变

    C# 泛型接口的抗变和协变

    本篇文章主要介绍了C#中泛型接口的抗变和协变的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-03-03
  • c#泛型学习详解 创建线性链表

    c#泛型学习详解 创建线性链表

    Visual C# 2.0 的一个最受期待的(或许也是最让人畏惧)的一个特性就是对于泛型的支持。这篇文章将告诉你泛型用来解决什么样的问题,以及如何使用它们来提高你的代码质量,还有你不必恐惧泛型的原因
    2014-01-01
  • C# 控制台实现一次性输入多行的操作

    C# 控制台实现一次性输入多行的操作

    这篇文章主要介绍了C# 控制台实现一次性输入多行的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • C#集合之可观察集合的用法

    C#集合之可观察集合的用法

    这篇文章介绍了C#集合之可观察集合的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C#判断字符串中是否包含指定字符串及contains与indexof方法效率问题

    C#判断字符串中是否包含指定字符串及contains与indexof方法效率问题

    这篇文章主要介绍了C#判断字符串中是否包含指定字符串及contains与indexof方法效率问题 ,文中给大家列举通过两种方法来判断,需要的朋友可以参考下
    2018-10-10
  • C#简单读取、改变文件的创建、修改及访问时间的方法

    C#简单读取、改变文件的创建、修改及访问时间的方法

    这篇文章主要介绍了C#简单读取、改变文件的创建、修改及访问时间的方法,涉及C#文件类SetCreationTime、SetLastWriteTime及SetLastAccessTime的相关使用技巧,需要的朋友可以参考下
    2015-07-07
  • C#中判断一个集合是否是另一个集合的子集的简单方法

    C#中判断一个集合是否是另一个集合的子集的简单方法

    本文介绍利用C#中内置的系统函数判断一个集合是否是一个集合的子集的方法,此方法代码量极少,分享给大家。
    2016-04-04
  • C#使用委托的步骤浅析

    C#使用委托的步骤浅析

    这篇文章主要介绍了C#使用委托的步骤,以实例形式深入浅出的讲解了C#关于委托的定义、声明、实例化及相关的用法,具有很好的参考借鉴价值,需要的朋友可以参考下
    2014-11-11
  • C# WebApi 接口传参详解

    C# WebApi 接口传参详解

    这篇文章主要介绍了C# WebApi 接口传参详解,本篇打算通过get、post、put、delete四种请求方式分别谈谈基础类型(包括int/string/datetime等)、实体、数组等类型的参数如何传递。感兴趣的小伙伴们可以参考一下
    2018-07-07

最新评论