C# 模式匹配

· 浏览次数 : 6

小编点评

本文介绍了C#中的模式匹配(Pattern Matching),这是一种在代码中识别和提取数据的机制。模式匹配允许您以声明式的方式检查对象的形状,而无需编写冗长的条件语句。文章主要讨论了模式匹配的主要特性和应用场景。 1. **模式匹配的主要特性**:包括类型模式、属性模式、位置模式、var模式、恒定模式和弃元模式。这些特性使模式匹配能够检查对象是否属于特定类型、是否具有特定属性、其具体结构等。 2. **模式匹配的应用场景**:类型判断和转换、属性检查、数据解构、列表处理、错误处理以及领域驱动设计。在这些场景中,模式匹配提供了一种更简洁、可读性更强的代码实现。 3. 示例:通过一系列示例,如类型判断、属性检查、数据解构、列表处理、错误处理以及领域建模等,展示了模式匹配的实际应用。 总之,模式匹配是C#中一种强大的功能,可以帮助开发者编写更简洁、可读性更强的代码,并在某些情况下提高性能。掌握模式匹配的使用技巧对于提高代码质量和开发效率具有重要意义。

正文

C# 模式匹配

patternmatching

https://www.geeksforgeeks.org/pattern-matching-in-c-sharp/

https://www.codeproject.com/Articles/5368148/Your-Quick-Guide-to-Pattern-Matching-in-Csharp

什是模式匹配

模式匹配是一种在代码中识别和提取数据的机制。它允许您以声明式的方式检查对象的形状,而无需编写冗长的条件语句。

模式匹配的优势

  • Type-Testing 类型测试
  • Nullable-type checking 可空类型检查
  • Type casting and assignment 类型转换和分配
  • High readability 可读性高
  • Concise syntax 简洁的语法
  • Less convoluted code 代码更简洁

模式匹配的主要特性包括

  1. 类型模式:检查对象是否属于特定的类型。
  2. 属性模式:检查对象是否具有特定的属性。
  3. 位置模式:检查对象的具体结构。
  4. var 模式:将匹配的值存储在变量中以供后续使用。
  5. 恒定模式 :与常量值进行测试,常量值可以包括 intfloatcharstringbool、,用constnull声明的字段。
  6. 弃元模式:与 discard 运算符_的模式匹配,匹配任何内容,包括 null,它的用法在新的开关表达式中大放异彩,以匹配默认或否则情况。
  7. 元组模式:从位置模式的特殊派生,您可以在其中测试同一表达式中类型的多个属性。
  8. 列表模式:列表匹配模式是 C# 中模式匹配的最新补充,使用列表模式,您可以将列表或数组与一组顺序元素进行匹配。

模式匹配的主要应用场景

  1. 类型判断和转换:
    • 替代传统的 isas 操作符,提供更简洁的语法。
    • switch 语句中进行类型匹配。
  2. 属性检查:
    • 检查对象是否具有某些属性,并基于属性值采取不同的操作。
    • if 语句中进行属性模式匹配。
  3. 数据解构:
    • 对元组、记录类型等复杂数据结构进行解构,提取感兴趣的部分。
    • var 模式中使用位置模式匹配。
  4. 列表和数组处理:
    • 使用模式匹配检查列表或数组的长度和元素位置。
    • switch 语句中对列表进行模式匹配。
  5. 错误处理:
    • try-catch 语句中使用模式匹配捕获特定类型的异常。
    • switch 语句中对异常类型进行模式匹配。
  6. 领域驱动设计:
    • 使用模式匹配表达领域概念,提高代码的可读性和可维护性。
    • 在领域模型中使用模式匹配进行数据验证和转换。

示例

  1. 类型判断和转换:

    object obj = "Hello, world!";
    if (obj is string s)
    {
        Console.WriteLine(s.ToUpper()); // 输出: HELLO, WORLD!
    }
    
    switch (obj)
    {
        case string s:
            Console.WriteLine($"It's a string: {s}");
            break;
        case int i:
            Console.WriteLine($"It's an integer: {i}");
            break;
        default:
            Console.WriteLine("It's something else");
            break;
    }
    
  2. 属性检查:

    var person = new { Name = "Alice", Age = 30 };
    if (person is { Age: >= 18 })
    {
        Console.WriteLine($"{person.Name} is an adult.");
    }
    
  3. 数据解构:

    var point = (10, 20);
    if (point is (int x, int y))
    {
        Console.WriteLine($"X: {x}, Y: {y}");
    }
    
    var list = new List<int> { 1, 2, 3, 4, 5 };
    if (list is [_, _, int middle, _, _])
    {
        Console.WriteLine($"The middle element is: {middle}");
    }
    
  4. 列表和数组处理:

    var numbers = new List<int> { 1, 2, 3, 4, 5 };
    switch (numbers)
    {
        case []:
            Console.WriteLine("The list is empty.");
            break;
        case [int first]:
            Console.WriteLine($"The list has one element: {first}");
            break;
        case [int first, int second]:
            Console.WriteLine($"The list has two elements: {first}, {second}");
            break;
        case var all:
            Console.WriteLine($"The list has {all.Count} elements.");
            break;
    }
    
  5. 错误处理:

    try
    {
        // 某些可能引发异常的操作
    }
    catch (DivideByZeroException ex)
    {
        Console.WriteLine($"Caught DivideByZeroException: {ex.Message}");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Caught general Exception: {ex.Message}");
    }
    
    
  6. 领域驱动设计:

    public record Person(string Name, int Age);
    
    var person = new Person("Alice", 30);
    if (person is { Age: >= 18 })
    {
        Console.WriteLine($"{person.Name} is an adult.");
    }
    
  7. 恒定模式:

    public bool IsFreshProduce(FoodModel food)
    {
        return food?.Category?.ID is (int)  ProductCategoryEnum.FreshProduce;
    }
    
  8. 弃元模式:

    //如果未提供食物的储存温度或数字与以下范围不匹配,则将引发自定义异常
    public int GetFoodStorageTemperature
           (StorageRequirementEnum storageRequirement) => storageRequirement switch
    {
        StorageRequirementEnum.Freezer => -18,
        StorageRequirementEnum.Refrigerator => 4,
        StorageRequirementEnum.RoomTemperature => 25,
        _ => throw new InvalidStorageRequirementException()
    };
    
    // switch (storageRequirement)
            // {
            //     case StorageRequirementEnum.Freezer:
            //         return -18;
            //     case StorageRequirementEnum.Refrigerator:
            //         return 4;
            //     case StorageRequirementEnum.RoomTemperature:
            //         return 25;
            //     default:
            //         throw new Exception();
            // }
    
  9. 元组模式:

    //转基因食品检测
    public string GetFoodDescription(FoodModel food) => (food.NonGMO, food.Category.ID) switch
    {
     (true, (int)ProductCategoryEnum.FreshProduce) => "Non-GMO Fresh Product",
     (true, (int)ProductCategoryEnum.Dairy) => "Non-GMO Dairy",
     (false, (int)ProductCategoryEnum.Meats) => "GMO Meats. Avoid!",
     (_, _) => "Invalid Food Group"
    };
    // switch (food.NonGMO, food.Category.ID)
    // {
    //     case (true, (int)ProductCategoryEnum.FreshProduce):
    //         return "Non-GMO Fresh Product";
    //     case (true, (int)ProductCategoryEnum.Dairy):
    //         return "Non-GMO Dairy";
    //     case (false, (int)ProductCategoryEnum.Meats):
    //         return "GMO Meats. Avoid!";
    //     default:
    //         return "Invalid Food Group";
    // }
    
    
  10. 列表模式:

public (int?, int?) FindNumberOneAndNumberFour()
{
   int[] numbers = { 1, 2, 3, 4, 5 };
   // Match if 2nd value is anything, 3rd is greater than or equal 3, fifth is 5
   if (numbers is [var numberOne, _, >= 3, int numberFour, 5])
   {
       return (numberOne, numberFour);
   }
   return (null, null);
}

这些案例展示了模式匹配在各种场景下的应用,包括类型判断、属性检查、数据解构、列表处理、错误处理以及领域建模等。通过使用模式匹配,您可以编写更简洁、可读性更强的代码,同时也能在某些情况下提高性能。熟练掌握这些模式匹配的使用技巧,将有助于您提高代码质量和开发效率。

获得永久免费的无限 GPT 查询次数,点击链接并下载Monica插件,即可参加限时活动。
https://monica.im/invitation?c=OWBJ2ZBE

与C# 模式匹配相似的内容:

C# 模式匹配

C# 模式匹配 https://www.geeksforgeeks.org/pattern-matching-in-c-sharp/ https://www.codeproject.com/Articles/5368148/Your-Quick-Guide-to-Pattern-Matching-i

C#.Net筑基-模式匹配汇总

从C#7开始支持的 模式匹配 语法(糖,挺甜),可非常灵活的对数据进行条件匹配和提取,经过多个版本的完善,已经非常强大了。

[转帖]openGauss 安全认证

https://cdn.modb.pro/db/179816 openGauss数据库是一款标准的基于客户端/服务端(C/S)模式工作的数据库系统,每一个完整的会话连接都由后台服务进程和客户端进程组成。一个完整的客户端认证过程如图所示。 openGauss认证详细流程 (1) 客户端依据用户需求配置

Singleton Pattern 单例模式简介与 C# 示例【创建型5】【设计模式来了_5】

根据实例介绍单例模式。

Builder 生成器模式简介与 C# 示例【创建型2】【设计模式来了_2】

在构造一个复杂的对象(参数多且有可空类型)时,通过一个统一的构造链路,可选择的配置所需属性值,灵活实现可复用的构造过程。

Prototype 原型模式简介与 C# 示例【创建型4】【设计模式来了_4】

通过简单的示例代码,来介绍原型设计模式的特点与适用场景等。

Adapter 适配器模式简介与 C# 示例【结构型1】【设计模式来了_6】

关于 Adapter 适配器模式简介与 C# 示例。

Composite 组合模式简介与 C# 示例【结构型3】【设计模式来了_8】

〇、简介 1、什么是组合设计模式? 一句话解释: 针对树形结构的任意节点,都实现了同一接口,他们具有相同的操作,可以通过某一操作来遍历全部节点。 组合模式通过使用树形结构来组合对象,用来表示部分以及整体层次。组合模式属于结构型模式,多用于递归。 官方意图描述:将对象组合成树形结构,以表示“部分-整体

Bridge 桥接模式简介与 C# 示例【结构型2】【设计模式来了_7】

〇、简介 1、什么是桥接模式? 一句话解释: 通过一个类的抽象,与另一个类的抽象关联起来,当做桥。此后不管两个抽象类的实现有多少种,均可以通过这个桥来将两个对象联系起来。 桥接,顾名思义就是用桥来连接河两岸,将原本不关联的两部分联系起来,且不影响两岸的各自演化,演化出来的不同对象仍可以通过这个桥连接

Simple Factory 简单工厂模式简介与 C# 示例【创建型3.1】【设计模式来了_3.1】

本文通过简单的实例对简单工厂模式进行了介绍。