C#7.0 模式匹配

2022/9/7 1:41:33

本文主要是介绍C#7.0 模式匹配,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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

C#7.0 模式匹配

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

  • 是运算符
  • 切换语句
  • 开关表达式

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

在 C# 7.0 中引入:

  • 声明模式
  • 恒定模式
  • [ 曾是](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/patterns#var-pattern) 图案

在 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 模式匹配的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程