01、模式匹配概述
从C#7
开始支持的 模式匹配 语法(糖,挺甜),可非常灵活的对数据进行条件匹配和提取,经过多个版本的完善,已经非常强大了。
C# 支持多种模式,包括声明、类型、常量、关系、属性、列表、var 和弃元等,在is
、switch
语句、switch
表达式中使用,还可以使用布尔逻辑关键字 and
、or
和 not
组合多个模式,极大的简化了代码编写,可读性也还不错。
标题 | 说明 | 示例/备注 |
---|---|---|
类型和声明模式 | 如果类型兼容,则申明并赋值变量 | if (age is int i) |
常量模式 | 检查表达式值是否等于、不等于(not)常量值 | if(age is null || age is 0) |
关系模式>< |
使用关系运算符< 、> 、<= 或 >= 匹配 |
case 0 or <=6 |
逻辑模式 | 用not >and >or 连接多个模式表达式 |
case < 12 and ( >6 or 6) |
属性模式{:} |
对实例的属性、字段进行模式匹配:{属性/字段:匹配模式} |
if (b is { Year: < 2000, Month: 1 or 11 }) |
位置模式(解构) | 基于解构赋值进行模式匹配:(解构参数) |
if(point is (_,>0,>0)) |
var 模式 | 用var 申明(捕获)任意局部变量 |
if(point is var p && p.X>0) |
弃元模式_ | 弃元模式 _ 来匹配任何(其他)表达式 |
表示不要的 |
列表模式[] | 对数组(列表)进行匹配,在中括号[] 中匹配列表中的项 |
if(numbers is [_, 2, 3, ..]) |
📢 模式匹配基本都是语法糖,味道都不错!C#在编译时会输出原本的基础代码,可通过 https://sharplab.io/ 在线查看编译后的代码。
02、模式匹配
2.1、类型和声明模式
检查类型是否匹配,同时申明变量,如果类型兼容则申明并赋值变量,该变量在后面代码作用域中有效。
object age = "123";
if (age is int i) //类型匹配+申明变量i
{
Console.WriteLine($"age1 = {
i}");
}
switch (age)
{
case string: //类型匹配
Console.WriteLine($"type is string");
break;
case int iage: //类型匹配+申明变量iage
Console.WriteLine($"age2 = {
iage}");
break;
}
//上面is语句编译后的代码效果:
if (obj is int)
{
int value = (int)obj;
}
2.2、常量模式
检查表达式值是否等于、不等于(not
)常量值,常量值包括字面量常量,也包括const
常量值。传统的Switch
语句就是常量模式匹配。
object age = null;
if (age is not null && age is 100) //age is 100 等同于 age is int && (int)age==100
{
Console.WriteLine($"age1 = {
age}");
}
var type = age switch{
1 or 2 or 3=>"婴儿",
4 => "幼儿",
null or not 5 => "unknow",
_=>"",
};
2.3、关系模式><
用关系运算符来匹配表达式,就是对常量数值进行大小比较运算,使用关系运算符<
、>
、<=
或 >=
,多个表达式可用and
、or
连接,当然也支持括号。
object age = 6;
if (age is int n and >= 6)
{
Console.WriteLine("666");
}
switch (age)
{
case 0 or <=6:
Console.WriteLine("幼儿");
break;
case