属性模式是C# 8.0中引入的一种新的模式匹配功能。它允许你根据对象的属性或字段进行模式匹配,这使得代码更加简洁和直观。属性模式特别适用于解构复杂对象,并基于这些对象的属性值进行条件判断。
属性模式可以在多种场景下使用,包括但不限于:
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
}
}
在这个例子中,PersonValidator
类使用属性模式来验证Person
对象是否有效。它检查Age
属性是否在合理范围内,以及Name
属性是否非空。
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
}
}
在这个例子中,ShippingCalculator
类使用属性模式来计算订单的运费。它根据订单是否是优先订单以及订单金额来决定运费。
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
}
}
在这个例子中,ProductDisplay
类使用属性模式来决定产品的显示状态。根据库存量和类别,它会返回不同的状态字符串。
假设我们有一个订单系统,其中包含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%
}
}
在这个例子中,DiscountCalculator
类使用属性模式来计算订单的折扣。它检查订单的Customer
属性的MembershipLevel
字段以及Amount
字段来决定折扣百分比。
通过组合属性模式,我们可以在一个switch
表达式中同时匹配多个属性,这使得我们能够编写出更加强大和灵活的条件逻辑。这种模式的组合使用提高了代码的可读性和维护性,特别是在处理复杂的业务规则时。
C#的属性模式为代码提供了一种强大的模式匹配工具,它可以简化条件逻辑并提高代码的可读性。通过直接在switch
表达式中访问对象的属性,可以更容易地编写条件分支,从而使代码更加整洁。这些例子展示了属性模式在实际应用中的灵活性和实用性。开发者可以根据自己的需求,将属性模式应用到各种不同的场景中,以提高代码的表达力和效率。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!