0

0

C#的模式匹配(Pattern Matching)如何简化条件判断?

小老鼠

小老鼠

发布时间:2025-08-11 10:01:02

|

436人浏览过

|

来源于php中文网

原创

c#的模式匹配通过更简洁、强大的条件判断提升代码可读性和安全性。1. 相比传统if-else,模式匹配减少冗余代码和类型转换,实现类型检查、转换与属性提取一步到位;2. 在switch表达式中使用模式匹配需确保完备性,可借助\_处理默认情况;3. 处理复杂数据结构时可嵌套使用属性模式和位置模式,深入提取信息;4. 常见错误包括未覆盖所有输入情况和模式顺序不当,应利用编译器警告和单元测试避免;5. 性能通常与if-else相当或更优,但复杂模式可能影响效率,可通过减少属性访问、缓存结果等方式优化。

C#的模式匹配(Pattern Matching)如何简化条件判断?

C#的模式匹配本质上是一种更简洁、更强大的条件判断方式。它允许你根据数据的“形状”和“值”来进行分支,减少了冗余的代码和类型转换,让代码更易读也更安全。

解决方案

C#的模式匹配通过

is
switch
表达式实现,它不仅仅是简单的类型检查,还能同时进行类型转换和属性提取。

  • 类型模式 (Type Pattern): 最基础的用法,

    object o is string s
    ,如果
    o
    是字符串,则将其转换为
    s
    ,并在
    true
    分支中使用。

    object obj = "Hello";
    if (obj is string str)
    {
        Console.WriteLine(str.Length); // 无需额外类型转换
    }
  • 常量模式 (Constant Pattern): 匹配常量值,比如

    case null:
    case 0:

    object? value = null;
    switch (value)
    {
        case null:
            Console.WriteLine("Value is null");
            break;
        case 0:
            Console.WriteLine("Value is zero");
            break;
        default:
            Console.WriteLine("Value is something else");
            break;
    }
  • 属性模式 (Property Pattern): 直接检查对象的属性值。

    public class Point { public int X { get; set; } public int Y { get; set; } }
    
    Point p = new Point { X = 10, Y = 20 };
    if (p is { X: 10, Y: 20 })
    {
        Console.WriteLine("Point is (10, 20)");
    }
  • 位置模式 (Positional Pattern): 如果类型支持解构 (deconstruction),可以使用位置模式。

    public class Point { public int X { get; set; } public int Y { get; set; }
        public void Deconstruct(out int x, out int y) { x = X; y = Y; }
    }
    
    Point p = new Point { X = 5, Y = 7 };
    if (p is (5, 7))
    {
        Console.WriteLine("Point is (5, 7)");
    }
  • var 模式 (Var Pattern): 总是匹配,并将值赋给一个新变量。 常用于

    switch
    语句的
    default
    分支。

  • 弃元模式 (Discard Pattern):

    _
    表示,匹配任何值,但不使用它。 常用于忽略解构结果中的某些值。

    Decktopus AI
    Decktopus AI

    AI在线生成高质量演示文稿

    下载
  • 关系模式 (Relational Pattern): 使用关系运算符(, =)进行比较。

    int age = 25;
    string stage = age switch
    {
        < 18 => "Minor",
        >= 18 and < 65 => "Adult",
        _ => "Senior"
    };
  • 逻辑模式 (Logical Pattern): 使用

    and
    or
    not
    组合模式。

    if (obj is string s and not null)
    {
        Console.WriteLine("String is not null");
    }

模式匹配相比传统if-else语句有哪些优势?

模式匹配更简洁、可读性更高。 传统

if-else
链通常需要多次类型转换和属性访问,而模式匹配可以一步到位。 此外,模式匹配在编译时进行类型安全检查,减少了运行时错误的可能性。 想象一下,如果没有模式匹配,你需要写一堆
if (obj is Type)
然后强制转换,代码会变得很冗长。

如何在switch表达式中使用模式匹配?

switch
表达式是模式匹配的一个重要应用场景。 它可以根据不同的模式执行不同的代码块。 重要的是
switch
表达式必须是完备的 (exhaustive),即所有可能的输入都必须有对应的
case
分支处理。 如果编译器检测到
switch
表达式不是完备的,会发出警告。 你可以使用
_
(discard pattern) 作为默认分支来处理所有未匹配的情况。

object obj = 123;
string result = obj switch
{
    int i => $"It's an integer: {i}",
    string s => $"It's a string: {s}",
    null => "It's null",
    _ => "It's something else"
};

Console.WriteLine(result);

模式匹配在处理复杂数据结构时有哪些技巧?

当处理复杂数据结构,比如嵌套的对象或集合时,可以使用嵌套的模式匹配。 结合属性模式和位置模式,可以深入到数据结构的内部,提取所需的信息。 考虑一个场景:你需要处理一个包含地址信息的对象,地址信息本身又包含城市和邮政编码。 你可以使用嵌套的模式匹配来同时检查城市和邮政编码是否符合特定的条件。

public class Address { public string City { get; set; } public string ZipCode { get; set; } }
public class Person { public string Name { get; set; } public Address Address { get; set; } }

Person person = new Person { Name = "Alice", Address = new Address { City = "New York", ZipCode = "10001" } };

if (person is { Address: { City: "New York", ZipCode: "10001" } })
{
    Console.WriteLine("Person lives in New York with zip code 10001");
}

如何避免模式匹配中的常见错误?

最常见的错误是忘记处理所有可能的输入情况,导致

switch
表达式不完备。 另一个常见错误是在模式中使用错误的类型或属性名称。 为了避免这些错误,建议在编写模式匹配代码时,仔细考虑所有可能的输入情况,并使用单元测试来验证代码的正确性。 此外,可以利用编译器的警告来检测潜在的问题。 例如,如果编译器警告
switch
表达式不完备,就应该添加一个默认分支来处理所有未匹配的情况。 另外,注意模式匹配的顺序,因为模式是按顺序匹配的,一旦找到匹配的模式,就不会再尝试其他模式。

模式匹配对代码性能有什么影响?

模式匹配的性能通常与传统的

if-else
语句相当,甚至在某些情况下可能更好。 编译器会对模式匹配代码进行优化,使其在运行时尽可能高效。 然而,复杂的模式匹配可能会导致性能下降,特别是当模式涉及到大量的属性访问或类型转换时。 在这种情况下,可以使用性能分析工具来评估代码的性能,并进行必要的优化。 一种常见的优化方法是避免不必要的类型转换,或者使用更简单的模式来减少属性访问的次数。 另外,可以使用缓存来存储已经匹配过的结果,避免重复计算。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

358

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

233

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

437

2024.03.01

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1492

2023.10.24

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1492

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

230

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

86

2025.10.17

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

765

2023.08.22

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3万人学习

【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号