告别 if-else:C#.NET 模式匹配让代码更优雅的正确方式

作者:唐青枫日期:2025/11/26

简介

模式匹配是 C# 7.0 开始引入的革命性特性,它提供了更简洁、更强大的方式来检查和提取数据中的信息。随着每个版本的更新,模式匹配功能不断强化,成为现代 C# 开发的核心特性。

模式匹配允许将输入表达式与各种特征进行匹配,支持多种模式类型。它主要用于:

  • is 表达式:检查并可能声明变量。
  • switch 语句:传统分支逻辑。
  • switch 表达式:更简洁的表达式形式(C# 8.0 引入)。

模式匹配演进历程

版本新增特性
C# 7.0基本模式匹配:is 表达式、switch 语句增强
C# 8.0递归模式、属性模式、位置模式、switch 表达式
C# 9.0类型模式简化、逻辑模式(and/or/not)、关系模式
C# 10.0扩展属性模式
C# 11.0列表模式、切片模式

基础模式类型

声明模式

1// 检查类型并声明新变量
2if (obj is string str)
3{
4    Console.WriteLine($"字符串长度: {str.Length}");
5}
6
7// 传统方式对比
8if (obj is string)
9{
10    string str = (string)obj;
11    Console.WriteLine($"字符串长度: {str.Length}");
12}
13

类型模式

1// 只检查类型,不声明变量
2if (obj is string)
3{
4    Console.WriteLine("这是一个字符串");
5}
6
7//  switch 表达式中使用
8var result = obj switch
9{
10    string => "它是字符串",
11    int => "它是整数",
12    _ => "其他类型"
13};
14

常量模式

1// 检查特定值
2if (value is 5) { /* 值等于5 */ }
3if (value is null) { /* 值为null */ }
4if (value is "hello") { /* 字符串比较 */ }
5
6//  switch 
7string message = value switch
8{
9    0 => "零",
10    1 => "一",
11    null => "空值",
12    _ => "其他值"
13};
14

高级模式匹配

属性模式

1// 检查对象属性
2if (person is { Name: "John", Age: > 18 })
3{
4    Console.WriteLine("John 已成年");
5}
6
7// 嵌套属性模式
8if (order is { Customer: { Address: { City: "Beijing" } } })
9{
10    Console.WriteLine("北京客户的订单");
11}
12
13// C# 10 扩展属性模式
14if (order is { Customer.Address.City: "Beijing" })
15{
16    Console.WriteLine("北京客户的订单(简化写法)");
17}
18

位置模式(元组模式)

1// 元组解构和匹配
2var point = (x: 5, y: 10);
3var quadrant = point switch
4{
5    (0, 0) => "原点",
6    (var x, var y) when x > 0 && y > 0 => "第一象限",
7    (var x, var y) when x < 0 && y > 0 => "第二象限",
8    (var x, var y) when x < 0 && y < 0 => "第三象限",
9    (var x, var y) when x > 0 && y < 0 => "第四象限",
10    _ => "在坐标轴上"
11};
12

逻辑模式(C# 9.0+)

1// 使用逻辑运算符组合模式
2bool IsValid(object obj) => obj is not null and (string or int);
3
4// 复杂逻辑组合
5var category = value switch
6{
7    > 0 and < 10 => "小的正数",
8    < 0 or > 100 => "超出范围",
9    not null => "非空值",
10    _ => "其他"
11};
12

关系模式(C# 9.0+)

1// 使用关系运算符
2string GetSize(int value) => value switch
3{
4    < 0 => "负数",
5    >= 0 and < 10 => "小",
6    >= 10 and < 100 => "中",
7    >= 100 => "大"
8};
9
10// 与类型模式结合
11string Describe(object obj) => obj switch
12{
13    int i when i < 0 => "负整数",
14    int i when i > 0 => "正整数",
15    int => "零",
16    _ => "其他"
17};
18

列表模式(C# 11.0+)

1// 匹配数组或列表的特定模式
2int[] numbers = { 1, 2, 3, 4 };
3
4var result = numbers switch
5{
6    [1, 2, 3, 4] => "精确匹配",
7    [1, 2, ..] => "以1,2开头",
8    [.., 3, 4] => "以3,4结尾",
9    [1, .. var middle, 4] => $"以1开头4结尾,中间有{middle.Length}个元素",
10    [] => "空数组",
11    _ => "其他模式"
12};
13
14// 切片模式
15if (numbers is [var first, .. var rest])
16{
17    Console.WriteLine($"第一个元素: {first}, 剩余元素: {rest.Length}");
18}
19

字符串模式

1string text = "Hello, World";
2
3if (text is ['H','e','l','l','o', ..])
4{
5    Console.WriteLine("以Hello开头");
6}
7
8// 与Span<char>模式匹配结合
9ReadOnlySpan<char> span = text.AsSpan();
10if (span is ['H','e','l','l','o', ..])
11{
12    Console.WriteLine("匹配Span");
13}
14

自定义模式匹配

1// 通过 Deconstruct 方法支持位置模式
2public class Point
3{
4    public int X { get; }
5    public int Y { get; }
6    
7    public void Deconstruct(out int x, out int y)
8    {
9        x = X;
10        y = Y;
11    }
12}
13
14// 现在可以对 Point 使用位置模式
15var quadrant = point switch
16{
17    (0, 0) => "原点",
18    (var x, var y) when x > 0 && y > 0 => "第一象限",
19    // ...
20};w
21

表达式树中的模式匹配

1Expression<Func<object, bool>> expr = o => o switch
2{
3    int i when i > 0 => true,
4    string s when s.Length > 5 => true,
5    _ => false
6};
7
8// 解析表达式树
9if (expr.Body is SwitchExpression switchExpr)
10{
11    foreach (SwitchCase @case in switchExpr.Cases)
12    {
13        // 处理每个case
14    }
15}
16

实际应用场景

数据验证和处理

1public ValidationResult Validate(Order order)
2{
3    return order switch
4    {
5        null => ValidationResult.Failure("订单不能为空"),
6        { TotalAmount: <= 0 } => ValidationResult.Failure("金额必须大于0"),
7        { Customer: null } => ValidationResult.Failure("客户信息缺失"),
8        { Items: [] } => ValidationResult.Failure("订单项不能为空"),
9        { Status: OrderStatus.Cancelled } => ValidationResult.Failure("订单已取消"),
10        _ => ValidationResult.Success()
11    };
12}
13

API 响应处理

1public string HandleResponse(ApiResponse response)
2{
3    return response switch
4    {
5        { StatusCode: 200, Data: not null } => "成功",
6        { StatusCode: 404 } => "资源未找到",
7        { StatusCode: >= 400 and < 500 } => "客户端错误",
8        { StatusCode: >= 500 } => "服务器错误",
9        { Error: not null } => $"错误: {response.Error.Message}",
10        _ => "未知响应"
11    };
12}
13

告别 if-else:C#.NET 模式匹配让代码更优雅的正确方式》 是转载文章,点击查看原文


相关推荐


从源码到npm:手把手带你发布Vue 3组件库
良山有风来2025/11/24

还记得上次为了统一团队UI风格,你不得不把同一个按钮组件复制粘贴到十几个项目里的痛苦经历吗?每次修改都要同步更新所有项目,一不小心就漏掉一两个,测试同事追着你满公司跑…… 今天,咱们就来彻底解决这个问题!我将带你从零开始,用最新的Vite工具链打包并发布一个专业的Vue 3组件库。学完这篇,你就能像Element Plus那样,让团队通过一句npm install就能使用你精心打造的组件库。 为什么你需要自建组件库? 先别急着写代码,咱们聊聊为什么这事值得你花时间。想象一下这些场景: 早上刚优化


Claude Code CLI更新又又又报错了?快来试试官方原生安装方式
小溪彼岸2025/11/22

前言 今天准备使用Claude Code CLI时发现Claude Code CLI又出问题不能用了,使用 npm list -g 查看NPM全局安装列表中又是有的,只是此时的CLI看着有些异常没有版本号🤣。这已经不是第一次出现这个问题了,之前就出现过,上次就是各种手动删除后重装才正常的,真是够折腾的。 本想打开官网看下Claude Code CLI的安装方式,打开官网后发现,官方发布了Claude Code CLI的原生版本安装方式,只需一行命令即可安装Claude Code CLI。 官


硬刚GPT 5.1,Grok 4.1来了,所有用户免费使用!
三寸3372025/11/20

还得是马斯克,直接杠! 就在OpenAI发布GPT-5.1没几天,马斯克这边就坐不住了。 刚刚,xAI官宣推出最新版本Grok 4.1,直接面向全球所有用户免费开放。 马斯克本人在X平台上表示,这次更新会让用户"明显感受到速度和质量的双重提升"。 目前,用户可以在Grok网站、X平台,以及iOS和Android应用程序上直接使用Grok 4.1。 更关键的是,这次不是只有付费用户才能体验,所有用户(包括免费用户)都能用上。 这波操作可谓诚意十足! 和前代Grok 4


Gemini 3.0 发布,Antigravity 掀桌,程序员何去何从?
该用户已不存在2025/11/19

昨天,谷歌不开任何发布会,直接甩出了一枚重磅炸弹——Gemini 3.0。 这一波更新来得猝不及防。Gemini 3.0 不仅第一时间登陆了 AI Studio 和 Gemini CLI,还直接渗透到了开发者最常用的工具链里:Cursor、GitHub Copilot、JetBrains 全家桶,以及 Cline。甚至连谷歌自家的一系列产品,今天起也都集成了 Gemini 3 Pro 预览版。 伴随模型发布,谷歌还掏出了一个全新的开发平台,Google Antigravity。谷歌说这是 VS


Python 的内置函数 zip
IMPYLH2025/11/17

Python 内建函数列表 > Python 的内置函数 zip Python 的内置函数 zip() 是一个非常有用的工具函数,用于将多个可迭代对象(如列表、元组等)中的元素按顺序打包成一个个元组,然后返回由这些元组组成的迭代器。其基本语法为: zip(*iterables) 其中,iterables 可以是多个可迭代对象,比如列表、元组、字符串等。zip() 函数会将这些可迭代对象中相同索引位置的元素组合成一个元组,最终返回一个迭代器。 主要特点 并行迭代:zip() 可以同时遍


Python 的内置函数 round
IMPYLH2025/11/16

Python 内建函数列表 > Python 的内置函数 round Python 的内置函数 round() 用于对数字进行四舍五入操作。它的基本语法如下: round(number, ndigits) 其中: number 是需要进行四舍五入的数字ndigits 是保留的小数位数(可选参数) 详细说明: 当省略 ndigits 参数时,函数会返回最接近的整数ndigits 可以为负数,表示对整数部分进行四舍五入(例如十位、百位等) 应用示例: # 基本用法 print(ro


Python 的内置函数 next
IMPYLH2025/11/15

Python 内建函数列表 > Python 的内置函数 next Python 的内置函数 next() 是一个用于迭代器协议的重要函数,它能够从迭代器中获取下一个元素。next() 函数的基本语法如下: next(iterator[, default]) 其中: iterator 是一个可迭代对象(必须实现了 __next__() 方法的迭代器)default 是可选参数,当迭代器耗尽时返回该默认值,若不提供默认值且迭代器耗尽则会抛出 StopIteration 异常 使用示例:


CMake Error at fc_base/gflags-src/CMakeLists.txt:73
WGS.2025/11/14

完整日志: CMake Warning (dev) at /root/miniconda3/share/cmake-4.1/Modules/FetchContent.cmake:1373 (message): The DOWNLOAD_EXTRACT_TIMESTAMP option was not given and policy CMP0135 is not set. The policy's OLD behavior will be used. When using a UR


Lua 的 Math 模块
hubenchang05152025/11/13

#Lua 的 Math 模块 请查看 Lua 标准库模块列表 了解更多相关 API。 常量说明math.huge数值的最大值,通常对应 C 语言中的 HUGE_VALmath.maxinteger整数的最大值,通常对应 C 语言中的 LONG_MAXmath.mininteger整数的最小值,通常对应 C 语言中的 LONG_MINmath.pi圆周率 函数说明math.max取最大值math.min取最小值math.ceil向上取整math.floor向下取整math.modf分解整数部


从“零”构建零售EDI能力:实施路径与常见陷阱
伊士格科技2025/11/11

从“人工对单”到“智能集成”的必经之路 在供应链数字化协同的时代,零售企业从营销渠道到仓库与工厂的协同速度直接决定了库存成本与客户满意度。许多零售商过去依赖邮件、Excel 或 FTP 文件来处理订单与发票,但随着供应链复杂度提升、合作伙伴增多、交易量剧增,这种人工对接方式已不堪重负。 越来越多的零售企业意识到:构建 EDI(电子数据交换)能力,不再只是满足客户要求,而是实现供应链高效协作的关键能力。 然而,从“零”构建 EDI 能力并不容易——涉及标准协议(如EDIFACT、TRADEC

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2025 聚合阅读