当前位置:首页 > C# > 正文

C# Switch表达式进阶指南(深入掌握模式匹配技巧)

在 C# 8.0 及更高版本中,switch 表达式模式匹配的结合极大地增强了代码的可读性和表达能力。本教程将带你从基础到进阶,全面掌握 C# 中 switch 表达式的模式匹配用法,即使是编程小白也能轻松上手!

C# Switch表达式进阶指南(深入掌握模式匹配技巧) switch表达式 模式匹配 C#教程 高级switch用法 第1张

什么是 Switch 表达式?

传统的 switch 语句在 C# 中用于条件分支,但语法冗长且容易出错。C# 8.0 引入了 switch 表达式,它是一种更简洁、函数式风格的写法。

// 传统 switch 语句string GetGrade(int score){    switch (score)    {        case >= 90:            return "A";        case >= 80:            return "B";        case >= 70:            return "C";        default:            return "F";    }}// 使用 switch 表达式(C# 8.0+)string GetGrade(int score) => score switch{    >= 90 => "A",    >= 80 => "B",    >= 70 => "C",    _      => "F"};

可以看到,switch 表达式更紧凑,无需 breakreturn,每个分支直接返回值。

模式匹配:让 Switch 更智能

C# 的模式匹配允许你在 switch 中不仅判断值,还能检查类型、解构对象、甚至使用逻辑运算符。以下是几种常见的模式:

1. 类型模式(Type Patterns)

根据变量的运行时类型进行匹配:

object obj = GetSomeObject();string result = obj switch{    string s       => $"字符串: {s}",    int i when i > 0 => $"正整数: {i}",    int i          => $"非正整数: {i}",    null           => "空值",    _              => "未知类型"};

注意:when 子句用于添加额外条件,这是 C# 模式匹配的强大之处。

2. 属性模式(Property Patterns)

可以基于对象的属性值进行匹配:

public record Person(string Name, int Age);Person person = new("小明", 17);string message = person switch{    { Age: >= 18 } => $"{person.Name} 已成年",    { Name: "小明" } => "欢迎你,小明!",    { Age: < 0 }   => "年龄无效",    _              => "信息待确认"};

3. 元组模式(Tuple Patterns)

对多个值同时进行模式匹配:

var point = (x: 0, y: 0);string location = point switch{    (0, 0)         => "原点",    (0, _)         => "Y 轴上",    (_, 0)         => "X 轴上",    (var x, var y) when x == y => "在 y=x 线上",    _              => "普通点"};

4. 逻辑模式(Logical Patterns)— C# 9.0+

使用 andornot 组合条件:

int number = 15;string category = number switch{    < 0                => "负数",    0                  => "零",    >= 1 and <= 10     => "1 到 10 之间",    >= 11 or >= 100    => "大于等于 11 或大于等于 100",    not (>= 1 and <= 100) => "不在 1~100 范围内",    _                  => "其他"};

实战示例:处理不同类型的订单

假设我们有多种订单类型,使用 switch 表达式和模式匹配可以优雅地处理:

public abstract record Order;public record PhysicalOrder(string Address) : Order;public record DigitalOrder(string Email) : Order;public record SubscriptionOrder(DateTime ExpiryDate) : Order;string ProcessOrder(Order order) => order switch{    PhysicalOrder { Address: var addr } => $"发货到地址: {addr}",    DigitalOrder { Email: var email }    => $"发送下载链接至: {email}",    SubscriptionOrder { ExpiryDate: var exp } when exp < DateTime.Now                                          => "订阅已过期",    SubscriptionOrder { ExpiryDate: var exp }                                          => $"订阅有效期至: {exp:yyyy-MM-dd}",    null                                 => "订单为空",    _                                    => "未知订单类型"};

总结

通过本教程,你已经掌握了 C# 中 switch 表达式模式匹配的核心用法。这些特性不仅能让你的代码更简洁,还能提升可维护性和表达力。

记住以下关键点:

  • switch 表达式返回值,无需 break
  • 使用 _ 作为默认情况(discard pattern)
  • 结合 when 添加守卫条件
  • 利用属性模式、元组模式、逻辑模式处理复杂场景

无论你是初学者还是有经验的开发者,掌握这些 C# 教程中的高级技巧,都能显著提升你的编码效率。赶快在项目中尝试这些 高级switch用法吧!

—— 本文涵盖关键词:C# switch表达式、模式匹配、C#教程、高级switch用法 ——