C# 几种模式匹配写法帮你优化你的代码质量

1. 模式匹配(C# 7.0+)

使用 switch 表达式和属性模式简化复杂条件判断:

public string GetShapeDescription(object shape)
{
    return shape switch
    {
        Circle { Radius: > 10 } c => $"大圆 (半径={c.Radius})",
        Circle { Radius: var r } when r > 0 => $"小圆 (半径={r})",
        Rectangle rect => $"矩形 ({rect.Width}x{rect.Height})",
        _ => "未知形状"
    };
}

2. 策略模式(行为逻辑解耦)

封装可互换的算法逻辑:

// 定义策略接口
public interface IShippingStrategy 
{
    decimal CalculateFee(Order order);
}

// 具体策略
public class ExpressShipping : IShippingStrategy 
{
    public decimal CalculateFee(Order order) => order.Total * 0.1m;
}

// 上下文使用策略
public class ShippingService(IShippingStrategy strategy)
{
    public decimal GetShippingFee(Order order) 
        => strategy.CalculateFee(order);
}

// 使用示例
var service = new ShippingService(new ExpressShipping());
service.GetShippingFee(new Order());

3. 状态模式(状态驱动逻辑)

管理对象状态转换的逻辑:

public interface IOrderState 
{
    void HandleState(Order order);
}

public class DraftState : IOrderState
{
    public void HandleState(Order order) 
        => Console.WriteLine("草稿状态:可编辑内容");
}

public class Order
{
    private IOrderState _state = new DraftState();
    
    public void SetState(IOrderState state) => _state = state;
    
    public void Process() => _state.HandleState(this);
}

4. 条件化逻辑 (三元运算符 + ??)

简洁处理空值和默认值:

string name = user?.Name ?? "匿名用户";  // 空值合并
int discount = isVIP ? 30 : (age > 60 ? 20 : 0); // 嵌套三元

5. Fluent 链式调用 (Builder 模式)

构建可读性高的逻辑链:

public class QueryBuilder
{
    private string _query = "SELECT * FROM Users";
    
    public QueryBuilder Where(string condition) 
    {
        _query += $" WHERE {condition}";
        return this;
    }
    
    public QueryBuilder OrderBy(string field) 
    {
        _query += $" ORDER BY {field}";
        return this;
    }
    
    public string Build() => _query;
}

// 使用示例
var query = new QueryBuilder()
    .Where("Age > 30")
    .OrderBy("Name DESC")
    .Build();

6. 规则引擎模式

动态组合业务规则:

public interface IDiscountRule 
{
    bool IsEligible(Order order);
    decimal GetDiscount();
}

public class DiscountCalculator
{
    private List<IDiscountRule> _rules = new();

    public DiscountCalculator AddRule(IDiscountRule rule) 
    {
        _rules.Add(rule);
        return this;
    }
    
    public decimal Calculate(Order order) 
        => _rules.Where(r => r.IsEligible(order))
                 .Sum(r => r.GetDiscount());
}

何时使用何种模式?

  • 简单条件 → 模式匹配/三元运算符
  • 可扩展算法 → 策略模式
  • 状态转换 → 状态模式
  • 复杂业务流程 → 规则引擎
  • 配置型逻辑 → Fluent API / Builder
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值