ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C#7.0 模式匹配

2022-09-06 08:31:21  阅读:246  来源: 互联网

标签: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,表达式
来源: https://www.cnblogs.com/amboke/p/16660368.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有