首页 > 编程语言 >C#7.0 模式匹配

C#7.0 模式匹配

时间:2022-09-06 08:34:17浏览次数:120  
标签:C# 模式 7.0 模式匹配 https 表达式

Photo by 托马斯·凯利 on 不飞溅

C#7.0 模式匹配

C# 在 C# 7.0 中引入了模式匹配。从那时起,每个主要的 C# 版本都扩展了模式匹配功能。 模式匹配 是一种测试表达式以确定它是否具有某些特征的技术。这是一个更普遍的功能 函数式语言 . C# 模式匹配为测试表达式和在表达式匹配时采取行动提供了更简洁的语法。 C# 允许通过三个结构进行模式匹配:

我们可以将输入表达式与哪种类型的模式匹配?

在 C# 7.0 中引入:

在 C# 8.0 中引入:

在 C# 9.0 中引入:

在这篇博文中,我们将了解 C#7.0 中引入的模式。

笔记 : 嵌套模式是递归模式,也就是说它们可以在其中包含其他模式。

#Declaration 和 Type 模式

声明模式 带类型 当表达式结果为非空且表达式结果的运行时类型为时匹配表达式 吨, 例如。,

 对象编号 = 15;  
 if (number is int) Console.WriteLine(number); // 输出:15

我们也可以使用这种模式来获得清晰、简洁的 无效的 查看:

 如果(输入不为空){  
 Console.WriteLine(输入);  
 }  
 别的 {  
 抛出新的 ArgumentNullException(参数名称:  
 nameof(input), message: "输入不应为空");  
 }

使用声明模式,我们还可以声明一个新的局部变量:

 对象编号 = 15;  
 if (number is int value) Console.WriteLine(value); // 输出:15

或者

 对象编号 = 15;  
 if (number is int value && value == 14) Console.WriteLine(value); // 输出:15

使用开关表达式:

 object text = "示例文本..."; bool IsString(object val) => val switch  
 {  
 string => true, // 如果我们只想检查它是否为字符串(从 C# 9.0 开始),这里我们使用“string”而不是“string_” _ => 假 };

或者如果我们需要使用一个值:

 char FirstLetter(object val) => val switch {  
 字符串 s => s.FirstOrDefault() ,  
 null 或 _ => throw new ArgumentException(paramName: nameof(val), message: "Value 应该是一个字符串而不是 null"), };

笔记 开关表达式 无法返回 空白 .它必须返回一个值。这是 github问题链接 .

#常量模式

用于检查常量值,可以是数字、字符串、字符、布尔值和枚举类型。

 枚举 MyEnum{A,B,C} 字符串 EnumChecker(MyEnum myEnum) => myEnum 开关{ MyEnum.A => "A",  
 MyEnum.B => "B",  
 MyEnum.C => "C",  
 _ => "不是 A、B 或 C"  
 };

笔记: 类型为的表达式 跨度<char> 或者 只读跨度<char> 可以与 C# 11 及更高版本中的常量字符串匹配。

 公共布尔StartsWith2(跨度<char>chars) => 字符开关  
 {  
 _ 当 chars[1] 为 '2' => true 时,  
 _ => 假,  
 };  
 //如果是扩展方法就好了

使用常量模式检查 无效的:

 如果(输入为空)返回

# 曾是 图案

一个 曾是 当您需要布尔表达式中的临时变量来保存中间计算的结果时,模式很有用。

 allLists.Where(list => list.Count() is var count && count >= min && count <= max);

通过创建临时变量 数数 我们可以多次使用它而没有调用的性能成本 数数() 每一次。

在那个例子中,我们可以使用 是整数计数 相反—— 曾是 只是一种风格选择。但是,有两种情况 曾是 需要:对于 匿名类型 或者如果你想允许空值。因为 where 匹配空值。

 公共类节点{ 公共节点(int值){值=值;} 公共 int 值 { 获取;私人套装; }  
 公共节点下一个{获取;放; } }


 节点根 = new(6);  
              
 if (root.Next 是 var node && node.Value > 1)  
 {  
 //做一点事  
 }; // 将抛出 _空引用异常_

概括

在这篇博文中,您了解了如何使用 C# 7.0 附带的模式。在下一篇博文中,您将了解 C#8.0 中的模式。如果您不熟悉,请不要担心[ 转变](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/switch-expression) 表达式 ,[ 是](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/is) 操作员 ,[ 和](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/patterns#logical-patterns)[ 或者](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/patterns#logical-patterns) 模式组合器 然而。稍后我们将通过它们进行讨论。不管你在哪里,早安或晚安。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/18420/20120608

标签:C#,模式,7.0,模式匹配,https,表达式
From: https://www.cnblogs.com/amboke/p/16660368.html

相关文章

  • csapp-链接
    链接:将各种代码和数据片段收集并组合成一个单一文件的过程,这个文件可被加载到内存并执行。链接可执行于编译时、加载时、运行时。代码示例:静态链接:编译器驱动程序gc......
  • ASP.NET Core 6框架揭秘实例演示[35]:利用Session保留语境
    客户端和服务器基于HTTP的消息交换就好比两个完全没有记忆能力的人在交流,每次单一的HTTP事务体现为一次“一问一答”的对话。单一的对话毫无意义,在在同一语境下针对某个主......
  • C#委托事件进行窗体传值
    C#委托事件进行窗体传值窗体间传值是每个学习WinForm常见问题,最初级的方法就是在窗体中先获取到要接受值窗体。然后通过.得到某个空间或者属性,直接赋值,这个需要接收放的......
  • (non-)interactive (non-)login shell
    1loginshell当bash以loginshell形式登录的时候,bash会依次执行下列脚本,进行关键全局变量的初始化,如PATH。/etc/profile~/.bash_profile~/.bash_login~/.profile......
  • 如何用 JavaScript 编写游戏
    如何用JavaScript编写游戏今天的浏览器允许您创建具有完整图形的游戏。以下是使用JavaScript和HTML5编写简单赛车游戏的方法。浏览器现在为JavaScript开发人员提......
  • 校友聚光灯:Ben — 从音乐和音频总监到 CEO 和联合创始人
    校友聚光灯:Ben—从音乐和音频总监到CEO和联合创始人“我最终加入了CodeFellows,这太棒了。六个月的时间里,被其他真正热衷于它的人包围着,我不仅了解了软件世界,它是如......
  • LeetCode 问题之禅:第 92 天——数字和字符串
    LeetCode问题之禅:第92天——数字和字符串欢迎回到LeetCode日常练习系列.今天我做了2简单问题。让我们开始!Photoby迈克豪普特on不飞溅将整数转换为两个......
  • 强制推送本地分支覆盖远程失败git push origin master --force报错fatal: Authenticat
    当我想把本地分支强制性推到远程的master分支,执行gitpushoriginmaster--force命令时,报错如下:解决办法:重新配置用户名和邮箱gitconfig--globaluser.name"用户......
  • C++面向对象-构造函数与析构函数
    以OOP实现一个顺序栈为例,介绍构造函数与析构函数#include<iostream>#include<iterator>usingnamespacestd;/*构造函数和析构函数函数的名字和类名一样,......
  • MySQL教程 - 备份与恢复(Backup & Restore)
    更新记录转载请注明出处。2022年9月6日发布。2022年9月6日从笔记迁移到博客。备份与恢复备份数据库刷新缓存FLUSHTABLES;检查表键释放正确ANALYZETABLE表......