C# 9.0 中的新款匹配模式

Posted 全栈派

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 9.0 中的新款匹配模式相关的知识,希望对你有一定的参考价值。

C# 9.0 中新增和增强了一些匹配模式,让我们一起看一下!


  • 类型模式

  • 使用括号明确优先级模式

  • and模式

  • or模式

  • not模式

  • 关系模式


类型模式示例如下:

int age = 30;string name = "Zhang San";var tuple = (age, name);//当前写法if (tuple is (int a, string n)) { ... }//C# 9.0写法if (tuple is (intstring)) { ... }


关系模式、and模式、or模式示例如下:

//当前写法bool IsLetter(char c) => c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z';//C# 9.0写法bool IsLetter(char c) => c is >= 'a' and <= 'z' or >= 'A' and <= 'Z';


使用括号来明确and的优先级高于or

bool IsLetterOrSeparator(this char c) => c is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z') or '.' or ',';


not模式:

//当前写法if (!(obj is null)) { ... }//C# 9.0写法if (obj is not null) { ... }


用简单的示例再巩固一下新匹配模式的用法。下面是一个用来计算开车下班回家需要多长时间的方法:

var car = new Car{ Speed = 80};System.Console.WriteLine(TimeToHome(car));/// <summary>/// 计算下班开车到家所用的时间/// </summary>static string TimeToHome(object car) =>car switch{    Car c when c.Speed > 60 && c.Speed <= 100 => "20-30分钟", Car c when c.Speed > 100 && c.Speed <= 200 => "15-20分钟", Car c when c.Speed > 200 && c.Speed <= 260 => "10分钟之内", Car c when c is null => throw new System.ArgumentException("不太合理的交通工具!"), _ => throw new System.ArgumentException("不太合理的行驶速度!")};public class Car{ public int Speed { get; set; }}


使用顶级语句运行一下:

>dotnet run20-30分钟


下面我们用C# 9.0的新匹配模式,改造一下计算方法:

/// <summary>/// 计算下班开车到家所用的时间/// </summary>static string TimeToHome(object car) =>car switch{ Car c => c.Speed switch {        > 60 and <= 100 => "20-30分钟", > 100 and <= 200 => "15-20分钟", > 200 and <= 260 => "10分钟之内", _ => throw new System.ArgumentException("不太合理的行驶速度!") }, not null => throw new System.ArgumentException("不太合理的行驶速度!"), null => throw new System.ArgumentException("不太合理的交通工具!")};


将速度提升到260

var car = new Car{ Speed = 260};System.Console.WriteLine(TimeToHome(car));
> dotnet run10分钟之内


模式匹配是功能编程语言的主要特征,更简便的匹配模式可以帮我们更高效的解决一些编程问题。


使用这些新的匹配模式,让我们更早更快的下班回家吧!


以上是关于C# 9.0 中的新款匹配模式的主要内容,如果未能解决你的问题,请参考以下文章

C# 9.0 中的新增功能

C# 9.0 新特性

C# 9.0 新特性预览

C# 9.0 新特性之 Lambda 弃元参数

C# 9.0 中的顶级语句

使用 C# 9.0 新语法提升 if 语句美感