public record Order(int Items, decimal Cost);
public decimal CalculateDiscount(Order order) =>
order switch
{
{ Items: > 10, Cost: > 1000.00m } => 0.10m,
{ Items: > 5, Cost: > 500.00m } => 0.05m,
{ Cost: > 250.00m } => 0.02m,
null => throw new ArgumentNullException(nameof(order), "Can't
calculate discount on null order"),
var someObject => 0m,
};
方法的主体是一个switch表达式,根据order
的属性值来计算折扣率。具体规则如下:
- 如果订单的商品数量大于10且总价大于1000.00,则折扣率为10%(0.10m)。
- 如果订单的商品数量大于5且总价大于500.00,则折扣率为5%(0.05m)。
- 如果订单的总价大于250.00,则折扣率为2%(0.02m)。
- 如果传入的订单为null,则抛出一个
ArgumentNullException
异常,提示不能对空订单计算折扣。 - 对于其他情况(即不满足以上任何条件),折扣率为0%。
最后,CalculateDiscount
方法返回计算出的折扣率。
var someObject
在这个上下文中不会创建一个新的对象。这里var someObject
仅仅是模式匹配中的一个占位符,用于捕获任何未明确匹配的输入,并指定一个默认的返回值。在C#的模式匹配中,var
关键字可以用来表示一个任意的引用类型或值类型的模式,但并不实际创建或初始化任何新的对象或变量。