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 (int, string)) { ... }
关系模式、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 run
20-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 run
10分钟之内
模式匹配是功能编程语言的主要特征,更简便的匹配模式可以帮我们更高效的解决一些编程问题。
使用这些新的匹配模式,让我们更早更快的下班回家吧!
以上是关于C# 9.0 中的新款匹配模式的主要内容,如果未能解决你的问题,请参考以下文章