编辑
2025-09-29
C#
00

目录

摘要
正文
应用场景
例子 1: 使用属性模式进行数据验证
例子 2: 基于属性值执行业务逻辑
例子 3: UI逻辑中的属性模式
例子4: 使用属性模式匹配嵌套对象
结论

摘要

属性模式是C# 8.0中引入的一种新的模式匹配功能。它允许你根据对象的属性或字段进行模式匹配,这使得代码更加简洁和直观。属性模式特别适用于解构复杂对象,并基于这些对象的属性值进行条件判断。

正文

应用场景

属性模式可以在多种场景下使用,包括但不限于:

  1. 数据验证:在对象的状态需要根据其属性值进行验证时。
  2. 业务逻辑:在根据对象的不同属性值执行不同的业务逻辑时。
  3. 状态机:在基于对象状态的复杂逻辑中,根据对象的属性决定状态转移。
  4. UI逻辑:在UI编程中,根据数据对象的属性来决定显示逻辑。

例子 1: 使用属性模式进行数据验证

C#
public class Person { public string Name { get; set; } public int Age { get; set; } } public static class PersonValidator { public static bool IsValid(Person person) => person switch { { Age: < 0 } => false, // Age不能为负数 { Age: > 120 } => false, // Age不能超过120岁 { Name: null } => false, // Name不能为空 _ => true }; } class Program { static void Main() { var person = new Person { Name = "Alice", Age = 130 }; Console.WriteLine(PersonValidator.IsValid(person)); // 输出: True } }

image.png

在这个例子中,PersonValidator类使用属性模式来验证Person对象是否有效。它检查Age属性是否在合理范围内,以及Name属性是否非空。

例子 2: 基于属性值执行业务逻辑

C#
public class Order { public decimal Amount { get; set; } public bool IsPriority { get; set; } } public static class ShippingCalculator { public static decimal CalculateShipping(Order order) => order switch { { IsPriority: true } => 0, // 优先订单免运费 { Amount: > 100 } => 0, // 订单金额超过100免运费 _ => 5 // 默认运费 }; } class Program { static void Main() { var order = new Order { Amount = 80, IsPriority = false }; Console.WriteLine(ShippingCalculator.CalculateShipping(order)); // 输出: 5 } }

image.png

在这个例子中,ShippingCalculator类使用属性模式来计算订单的运费。它根据订单是否是优先订单以及订单金额来决定运费。

例子 3: UI逻辑中的属性模式

C#
public class Product { public string Category { get; set; } public int Stock { get; set; } } public static class ProductDisplay { public static string GetDisplayStatus(Product product) => product switch { { Stock: 0 } => "Sold Out", { Category: "New" } => "New Arrival", { Stock: <= 5 } => "Low Stock", _ => "Available" }; } class Program { static void Main() { var product = new Product { Category = "Electronics", Stock = 20 }; Console.WriteLine(ProductDisplay.GetDisplayStatus(product)); // 输出: Available } }

image.png

在这个例子中,ProductDisplay类使用属性模式来决定产品的显示状态。根据库存量和类别,它会返回不同的状态字符串。

例子4: 使用属性模式匹配嵌套对象

假设我们有一个订单系统,其中包含Customer对象和Order对象,Order对象中有一个Customer属性。我们希望根据订单的金额以及订单所属客户的会员等级来决定折扣。

C#
public class Customer { public string Name { get; set; } public string MembershipLevel { get; set; } // 例如 "Gold", "Silver", "Bronze" } public class Order { public Customer Customer { get; set; } public decimal Amount { get; set; } } public static class DiscountCalculator { public static decimal CalculateDiscount(Order order) => order switch { // 会员等级为Gold,并且订单金额超过1000的订单,折扣为15% { Customer: { MembershipLevel: "Gold" }, Amount: > 1000 } => 0.15m, // 会员等级为Silver,并且订单金额超过500的订单,折扣为10% { Customer: { MembershipLevel: "Silver" }, Amount: > 500 } => 0.10m, // 其他情况,默认不提供折扣 _ => 0m }; } class Program { static void Main() { var customer = new Customer { Name = "Alice", MembershipLevel = "Gold" }; var order = new Order { Customer = customer, Amount = 1200 }; Console.WriteLine($"Discount: {DiscountCalculator.CalculateDiscount(order):P}"); // 输出: Discount: 15.00% } }

image.png

在这个例子中,DiscountCalculator类使用属性模式来计算订单的折扣。它检查订单的Customer属性的MembershipLevel字段以及Amount字段来决定折扣百分比。

通过组合属性模式,我们可以在一个switch表达式中同时匹配多个属性,这使得我们能够编写出更加强大和灵活的条件逻辑。这种模式的组合使用提高了代码的可读性和维护性,特别是在处理复杂的业务规则时。

结论

C#的属性模式为代码提供了一种强大的模式匹配工具,它可以简化条件逻辑并提高代码的可读性。通过直接在switch表达式中访问对象的属性,可以更容易地编写条件分支,从而使代码更加整洁。这些例子展示了属性模式在实际应用中的灵活性和实用性。开发者可以根据自己的需求,将属性模式应用到各种不同的场景中,以提高代码的表达力和效率。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!