首页 > 编程语言 >C# 使用模式匹配的好处,因为好用所以推荐~

C# 使用模式匹配的好处,因为好用所以推荐~

时间:2024-07-18 12:29:08浏览次数:15  
标签:Console C# 模式 numbers WriteLine 好用 模式匹配

  1. 类型检查和转换:当你需要检查对象是否为特定类型,并且希望在同一时间内将其转换为那个类型时,模式匹配提供了一种更简洁的方式来完成这一任务,避免了使用传统的as和is操作符后还需要进行额外的null检查。

  2. 复杂条件逻辑:在处理复杂的条件逻辑时,特别是涉及到多个条件和类型的情况下,使用模式匹配可以使代码更加清晰易读。通过模式匹配,可以将复杂的if-else链或switch语句简化,使逻辑更直观。

  3. 解构复合类型:当你需要从复合类型(如元组、自定义类等)中提取值时,模式匹配允许你直接在条件检查中进行解构,这样可以避免编写额外的解构代码,使得代码更加简洁。

  4. 范围检查:对于需要进行范围检查的场景,如检查一个数是否落在某个区间内,使用C# 9.0引入的关系模式可以极大简化代码,使得范围检查逻辑一目了然。

  5. 逻辑组合:在需要对多个条件进行逻辑组合的情况下,如需要检查一个值是否满足多个条件之一或全部条件,使用逻辑模式可以直接在模式匹配表达式中使用and、or和not运算符,避免了复杂的逻辑嵌套。

  6. 数据验证:模式匹配可以用于数据验证场景,特别是当验证逻辑涉及到类型检查、值范围检查或特定属性值检查时。通过模式匹配,可以在单个表达式中完成所有这些检查,使得验证逻辑更加紧凑和易于维护。

  7. 多态行为:在处理需要根据对象类型执行不同操作的多态行为时,模式匹配提供了一种更灵活的方式来替代传统的虚方法或接口实现。这使得在不修改原有类层次结构的情况下,能够更容易地扩展或修改行为。

  8. 替代访问者模式:在实现访问者设计模式时,模式匹配可以作为一种更简洁的替代方案,特别是在处理复杂的对象结构时。通过模式匹配,可以直接在一个地方处理所有类型的情况,而不需要为每种类型创建单独的访问者方法。

模式匹配的这些用途展示了它在简化代码、提高可读性和灵活处理不同类型和条件的强大能力。随着C#语言的发展,模式匹配的功能和应用场景将会进一步扩展和深化。

下面我们看下一些经典且好用的模式匹配编码风格:

is断言 变量s已被安全地转换为string类型

object obj = "Hello, World!";
if (obj is string s) {
    Console.WriteLine(s);
}

switch 允许使用多种模式,包括类型模式、常量模式和var模式 ,无需我们提前做转换以节省编码量

switch (obj) {
    case 0:
        Console.WriteLine("Zero");
        break;
    case var value:
        Console.WriteLine($"Value: {value}");
        break;
}

C# 8.0引入了属性模式,允许基于对象的属性进行模式匹配

public class Person {
    public string Name { get; set; }
    public int Age { get; set; }
}
Person person = new Person { Name = "John", Age = 30 };
//通俗易懂属性模式:如果person不为null,且name==john 并且age>=18的时候
if (person is { Name: "John", Age: >= 18 }) {
    Console.WriteLine("John is an adult.");
}

C# 9.0引入的逻辑模式,它允许使用逻辑运算符andornot来组合模式。

if (number is > 0 and < 10 or 100) {
    Console.WriteLine("Number is between 0 and 10 or equals 100.");
}

元组模式允许你对元组的元素进行模式匹配,这在处理元组返回值或多值情况时非常有用

var numbers = (1, "one", 18);
if (numbers is (1, string name, int age)) {
    Console.WriteLine($"The name of 1 is {name}, age {age}!");
}

列表模式允许对数组、列表等集合进行模式匹配,可以匹配集合的长度、元素等属性。这对于处理集合数据时进行模式匹配提供了极大的便利。

int[] numbers = { 1, 2, 3 };
if (numbers is [1, 2, 3]) {
    Console.WriteLine("The array contains the numbers 1, 2, and 3 in that order.");
}

切片模式允许你匹配集合的一部分,而不是整个集合。这在你只关心集合的某个特定部分时特别有用。

int[] numbers = { 0, 1, 2, 3, 4 };
if (numbers is [0, .., 4]) {
    Console.WriteLine("The array starts with 0 and ends with 4.");
}

当然这里只是介绍了部分好用的模式匹配,随着C#语言的逐代增强,可能会有更多的新特性和改进被引入。

标签:Console,C#,模式,numbers,WriteLine,好用,模式匹配
From: https://www.cnblogs.com/vipwan/p/18309290

相关文章

  • 笔灵AI论文工具好用吗?期刊论文撰写的智能革新
    期刊论文的撰写是一项既考验专业知识和研究深度,又考验写作能力和时间管理的复杂任务。面对这一挑战,AI技术的飞速发展为我们带来了新的机遇。笔灵AI论文写作助手,作为我的宝藏工具,将如何助力我们在这个过程中变得更加高效和专业?让我们一起探索。笔灵AI论文—期刊论文撰写的智能......
  • CF1978C
    一道构造题,我的做法似乎思维复杂度上远高于答案的做法,因而不是什么好做法,但幸好我最后还是调出来了,另外就是会爆ll...下意识写int的我根本想不起来用ll啊,看来不得不defineintlonglong了Code#include<iostream>#include<cstring>#include<string>#include<cstdio>#inc......
  • CF208E 题解
    BloodCousins前置知识:线段树合并。我们先把题目转化一下。这里先设\(v\)的\(p\)级祖先为\(u\),事实上要求的东西就是\(u\)的\(p\)级后代的个数减\(1\),减\(1\)是因为要把自己减去。显然这个目标点\(t\)要满足两个要求:\(t\)在\(u\)子树内。设\(dep_u\)表......
  • [SMC+OpenSSL]r3ctf nSMC
    SMC参考文章:https://www.cnblogs.com/hetianlab/p/17199400.htmlSMC实现的主要步骤包括:1.读取PE文件并找到需要加密的代码段。2.将代码段的内容进行异或加密,并更新到内存中的代码段。3.重定向代码段的内存地址,使得加密后的代码能够正确执行。4.执行加密后的代码段。OpenSS......
  • C39 使用SAR监测金矿开采活动
    主要内容:选择和创建多时相SAR合成影像。基于Sentinel-1图像的统计分析生成SAR变化检测。通过过滤最大面积斑块和森林/非森林和水体信息而产生的警报的后处理。Section1:Sentinel-1SARGRD:C-bandSyntheticApertureRadarGroundRangeDetected       ......
  • [1035] Extract the content from online PDF file or PDF url
    Certainly!WhenworkingwithonlinePDFsusingthepyPDF2libraryinPython,youcanretrievethecontentfromaPDFfilehostedataURL.Let’sexploreacoupleofwaystoachievethis:Usingrequests(Python3.xandhigher):Ifyou’reusingPython3.x......
  • Leetcoede编程基础0到1——1768. 交替合并字符串& 389. 找不同
    1768.交替合并字符串题目描述:给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。返回 合并后的字符串 。输入输出实例:  示例1:输入:word1="ab......
  • TCP协议详解
    传输控制协议(TCP,TransmissionControlProtocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。1.TCP头部格式源/目的端口:表示数据从哪个进程发送,然后发送到哪个进程去32位序列号:发送的数据按照一个字节一个编号存放进去32位确认号:用于给与对方响应,值为收到的TC......
  • CDN在直播中的运用(转载)
    1.CDN技术原理CDN的全称为ContentDeliveryNetwork,即内容分发网络,是一个策略性部署的整体系统,主要用来解决由于网络带宽小、用户访问量大、网点分布不均匀等导致用户访问网站速度慢的问题。这中间就有了很多的CDN节点,简单一点理解就相当于我们开始学习计算机选择网络。具体实现是......
  • c++中push_back和emplace_back
     push_back 和 emplace_back 都是用于在容器(如 std::vector, std::deque 等)的末尾添加元素的方法,但它们在实现细节和性能上有显著区别:构造方式:push_back 首先在容器外部构造一个完整的对象,然后将这个对象移动或拷贝到容器的末尾。emplace_back 直接在容器管理的......