当前位置: 首页 > news >正文

先看一个模式匹配的Case

public static bool IsPalindrome(ReadOnlySpan<char> input) => input is not [var first, ..var middle, var last] || (first == last && IsPalindrome(middle));

二、 模式匹配的主要类型

1. 类型模式

  • 检查表达式的运行时类型

2. 声明模式

  • 检查表达式的运行时类型,如果匹配成功,请将表达式结果分配给声明的变量

3. 常量模式

  • 测试表达式结果是否等于指定的常量

4. 关系模式

  • 将表达式结果与指定的常量进行比较

5. var模式

  • 匹配任何表达式并将其结果分配给声明的变量

6. 丢弃模式

  • 也叫弃元模式
  • 匹配任何表达式

7. 逻辑模式

  • 测试表达式是否与模式的逻辑组合匹配
  • 通过not、or及and进行组合

8. 带括号模式

  • 可在任何模式两边加上括号
  • 用来强调或更改 逻辑模式中的优先级

9. 列表模式

  • 测试元素序列是否与相应的嵌套模式匹配
  • 用于数组和集合类型

10. 切片模式

  • 切片模式只能显示在列表模式中,不能单独使用
  • 切片模匹配一个子列表
  • 切片模式中可以嵌套子模式

11. 属性模式

  • 测试表达式的属性或字段是否与嵌套模式匹配

12. 位置模式

  • 解构表达式结果并测试结果是否与嵌套模式匹配
  • 用于元组、record类型或其他定义了Deconstruct的类型

其中逻辑模式、列表模式、属性模式和位置模式是可嵌套其他模式的复杂模式

三、 在 C# 中以下场景支持模式匹配:

  • is 表达式
  • switch 语句
  • switch 表达式

四、简单的模式匹配

1. 类型模式

1.1 类型模式的Case
if(fruit is Apple) return "I like Apple!";
1.2 EasySyntax语法实现
  • 使用IsType扩展方法
var fruit = SyntaxFactory.IdentifierName("fruit"); var appleType = SyntaxFactory.IdentifierName("Apple"); var statement = fruit.IsType(appleType) .If() .Add(SyntaxGenerator.Literal("I like Apple!").Return()) .Build();
1.3 Roslyn原始语法
  • 使用SyntaxFactory.TypePattern构造类型模式
var fruit = SyntaxFactory.IdentifierName("fruit"); var appleType = SyntaxFactory.IdentifierName("Apple"); var statement = SyntaxFactory.IfStatement( SyntaxFactory.IsPatternExpression(fruit, SyntaxFactory.TypePattern(appleType)), SyntaxFactory.ReturnStatement(SyntaxFactory.LiteralExpression(SyntaxKind.StringLiteralExpression, SyntaxFactory.Literal("I like Apple!"))));
1.4 参考官方阅读
  • https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/operators/patterns#declaration-and-type-patterns

2. 声明模式

2.1 声明模式的Case
if (fruit is Apple apple) MakeApplePie(apple);
2.2 EasySyntax 语法实现
  • 使用VariablePattern扩展方法构造声明模式
var fruit = SyntaxFactory.IdentifierName("fruit"); var appleType = SyntaxFactory.IdentifierName("Apple"); var apple = SyntaxFactory.IdentifierName("apple"); var makeApplePieMethod = SyntaxFactory.IdentifierName("MakeApplePie"); var statement = fruit.Is(appleType.VariablePattern(apple.Identifier)) .If() .AddPatter(makeApplePieMethod.Invocation([apple])) .Build();
2.3 Roslyn原始语法
  • 使用SyntaxFactory.DeclarationPattern构造声明模式
var fruit = SyntaxFactory.IdentifierName("fruit"); var appleType = SyntaxFactory.IdentifierName("Apple"); var apple = SyntaxFactory.IdentifierName("apple"); var makeApplePieMethod = SyntaxFactory.IdentifierName("MakeApplePie"); var statement = SyntaxFactory.IfStatement( SyntaxFactory.IsPatternExpression(fruit, SyntaxFactory.DeclarationPattern(appleType, SyntaxFactory.SingleVariableDesignation(apple.Identifier))), SyntaxFactory.ExpressionStatement( SyntaxFactory.InvocationExpression(makeApplePieMethod, SyntaxFactory.ArgumentList(SyntaxFactory.SingletonSeparatedList(SyntaxFactory.Argument(apple))))));
2.4 参考官方阅读
  • 模式 - 使用 is 和 switch 表达式进行模式匹配。 - C# reference | Microsoft Learn

3. 常量模式

3.1 常量模式的Case
obj is null
3.2 EasySyntax 语法实现
  • 使用ToPattern扩展方法把表达式转化为常量模式
var obj = SyntaxFactory.IdentifierName("obj"); var expression = obj.Is(SyntaxGenerator.NullLiteral.ToPattern();
3.3 Roslyn原始语法
  • 使用SyntaxFactory.ConstantPattern把表达式转化为常量模式
var obj = SyntaxFactory.IdentifierName("obj"); var expression = SyntaxFactory.IsPatternExpression(obj, SyntaxFactory.ConstantPattern( SyntaxFactory.LiteralExpression(SyntaxKind.NullLiteralExpression)));
3.4 参考官方阅读
  • 模式 - 使用 is 和 switch 表达式进行模式匹配。 - C# reference | Microsoft Learn

4. 关系模式

4.1 关系模式的Case
!= 3
4.2 EasySyntax 语法实现
  • GreaterThanPattern扩展方法
  • GreaterOrEqualPattern扩展方法
  • LessThanPattern扩展方法
  • LessOrEqualPattern扩展方法
  • EqualPattern扩展方法
  • NotEqualPattern扩展方法
var pattern = SyntaxGenerator.NotEqualPattern(3);
4.3 Roslyn原始语法
  • 使用SyntaxFactory.RelationalPattern构造关系模式
var pattern = SyntaxFactory.RelationalPattern( SyntaxFactory.Token(SyntaxKind.ExclamationEqualsToken), SyntaxFactory.LiteralExpression( SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(3)));
4.4 参考官方阅读
  • 模式 - 使用 is 和 switch 表达式进行模式匹配。 - C# reference | Microsoft Learn

5. var模式

5.1 var模式的Case
GetScores(id) is var scores && scores.Average() >= 60
5.2 EasySyntax 语法实现
  • 使用SyntaxGenerator.VarPattern构造var模式
var getScoresMethod = SyntaxFactory.IdentifierName("GetScores"); var scores = SyntaxFactory.IdentifierName("scores"); var id = SyntaxFactory.IdentifierName("id"); var expression = getScoresMethod.Invocation([id]) .Is(SyntaxGenerator.VarPattern(scores.Identifier)) .LogicalAnd(scores.Access("Average").Invocation().GreaterOrEqual(SyntaxGenerator.Literal(60)));

5.3 Roslyn原始语法

  • 使用SyntaxFactory.VarPattern构造var模式
var getScoresMethod = SyntaxFactory.IdentifierName("GetScores"); var scores = SyntaxFactory.IdentifierName("scores"); var id = SyntaxFactory.IdentifierName("id"); var expression0 = SyntaxFactory.BinaryExpression(SyntaxKind.LogicalAndExpression, SyntaxFactory.IsPatternExpression( SyntaxFactory.InvocationExpression(getScoresMethod, SyntaxFactory.ArgumentList(SyntaxFactory.SingletonSeparatedList( SyntaxFactory.Argument(id)))), SyntaxFactory.VarPattern(SyntaxFactory.SingleVariableDesignation(scores.Identifier))), SyntaxFactory.BinaryExpression(SyntaxKind.GreaterThanOrEqualExpression, SyntaxFactory.InvocationExpression( SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, scores, SyntaxFactory.IdentifierName("Average"))), SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(60))));
5.4 参考官方阅读
  • 模式 - 使用 is 和 switch 表达式进行模式匹配。 - C# reference | Microsoft Learn

6. 丢弃模式

  • 丢弃模式常用于switch表达式
  • 也可用于列表和位置模式
6.1 丢弃模式的Case
date.Day switch { 15 => "今夜是月圆之夜", _ => "月圆要等到十五" }
6.2 Roslyn原始语法
  • 使用SyntaxFactory.DiscardPattern()声明丢弃模式
  • 以下case结合了EasySyntax的SwitchExpression语法
var date = SyntaxFactory.IdentifierName("date"); var expression = date.Access("Day") .SwitchExpression() .Case(SyntaxGenerator.Literal(15), SyntaxGenerator.Literal("今夜是月圆之夜")) .Case(SyntaxFactory.DiscardPattern(), SyntaxGenerator.Literal("月圆要等到十五")) .Switch.Build();
6.3 EasySyntax语法可以进一步简化
  • SwitchExpression中的Default封装了SyntaxFactory.DiscardPattern()
  • Default是最后一个分支,可以安全的直接Build
var date = SyntaxFactory.IdentifierName("date"); var expression = date.Access("Day") .SwitchExpression() .Case(SyntaxGenerator.Literal(15), SyntaxGenerator.Literal("今夜是月圆之夜")) .Default(SyntaxGenerator.Literal("月圆要等到十五")) .Build();
6.4 参考官方阅读
  • 模式 - 使用 is 和 switch 表达式进行模式匹配。 - C# reference | Microsoft Learn

五、逻辑模式

  • 逻辑模式嵌套了其他模式
  • 逻辑模式通过and、or及not组装其他模式

1. 逻辑模式的Case

  • 该Case通过and组装了1个常量模式和1个关系模式
0 and < 10

2. EasySyntax 语法实现

  • And扩展方法
  • Or扩展方法
  • Not扩展方法
var pattern = SyntaxGenerator.GreaterThanPattern(0) .And(SyntaxGenerator.LessThanPattern(10));

3. Roslyn原始语法

  • 使用SyntaxFactory.BinaryPattern构造逻辑模式
var pattern = SyntaxFactory.BinaryPattern(SyntaxKind.AndPattern, SyntaxFactory.RelationalPattern(SyntaxFactory.Token(SyntaxKind.GreaterThanToken), SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(0))), SyntaxFactory.Token(SyntaxKind.AndKeyword), SyntaxFactory.RelationalPattern(SyntaxFactory.Token(SyntaxKind.LessThanToken), SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(10))));

4. 参考官方阅读

  • 模式 - 使用 is 和 switch 表达式进行模式匹配。 - C# reference | Microsoft Learn

六、带括号模式

  • 可在任何模式两边加上括号
  • 用来强调或更改逻辑模式中的优先级
http://www.jsqmd.com/news/1138592/

相关文章:

  • NSK RNFTL5016A5 超重载滚珠丝杠技术详解
  • JESD204B 与 LVDS/CMOS 接口对比:5 大维度实测与 PCB 布局优化指南
  • AI落地页生成实战:从代码片段到生产就绪页面的技术演进
  • Okbiye|开题报告 AI 一键生成,告别熬夜改框架,科研起步零内耗
  • Minimax Hub实战指南:从环境配置到AI工作流自动化
  • 面向AI应用的后端架构设计:协议选型、服务治理与可观测性
  • 2026好用的视频去水印工具:电脑手机在线免费软件优缺点对比
  • 程序员就业:2026 年还能靠什么拿到,用真实案例讲清边界
  • 政务类仿冒网络钓鱼攻击的作案路径与全域安全防控研究
  • TensorBoard 日志解析与自定义插件开发:从 tfevents 文件到 3 种数据提取方法
  • C 语言猜数字小游戏完整实现(附带 8 次机会限制 + 菜单选择)(作业考试学习必备系列001)
  • Claude偷改了你一行代码
  • 智能车越野组技术解析:环境感知、决策规划与运动控制
  • Redis集群模式深度对比:主从、哨兵与Cluster的工程选型指南
  • 国产AI编程助手合规实践指南:通义灵码、CodeGeeX等落地应用
  • TDengine RSMA — 时间维度的滚动预聚合
  • AI 时代架构师:转型成长路线图
  • 华为Met基于您提供的《Oracle EBS FA事务处理底层表数据字典》,我将为您构建一个专注于EBS FA资产模块智能查询的AI模型。这个模型的核心思想是:将结构化的数据字典转化为AI可以理解的领
  • iPhone 6 原理图设计规范解析:51页图纸中的5项专业标注与布局技巧
  • AI视频生成技术在游戏特效制作中的应用实践
  • CO2激光与UV激光钻孔对比:3种PCB基材成孔质量与效率实测分析
  • 2026前端最新八股文最新前端笔试题面试题ai基础入门知识题,开放题,场景题,15项面试真题 ,实战题,源码解析,面试题基础理论都有
  • 竞争存在论:存在的投影法则——三连续统框架下的认知与本质
  • sklearn 1.4+ 朴素贝叶斯3大分类器对比:GaussianNB vs MultinomialNB vs BernoulliNB 实战解析
  • postman写断言(assert)
  • 电脑的安装与卸载
  • 本地部署AI生图与视频生成:免费开源工具实战指南
  • RAG 重排序观测性:召回多不代表答案稳
  • 2026上半年Java面试真题汇总!
  • 终极Sketch设计转代码指南:用Marketch插件5步实现自动化HTML生成