You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化这段嵌套if的C#代码?使用switch是否合理?

代码优化建议与问题解答

首先贴出你的原始代码(修正转义符号):

public int? GetNextStationId(int StationId, int NextStationId, int LineId, int Mode)
{
    int? nextStationid = 0;
    if (StationId != 0)
    {
        int order = _orderRepository.GetOrder(NextStationId, LineId);
        if (Mode == 1)
        {
            nextStationid = GetNextStationIdInArrival(LineId, order);
        }
        int orderminusOne = Get(StationId, LineId, order).Item2;

        if (orderminusOne < _orderRepository.LastOrderToModeBack(LineId))
        {
            nextStationid = 0;
            return nextStationid;
        }
        if (order != 0)
        {
            nextStationid = _orderRepository.GetStationId(LineId, orderminusOne);
            return nextStationid;
        }
        nextStationid = 0;
        return nextStationid;
    }
    return nextStationid;
}

代码优化方案

优化后的代码

public int? GetNextStationId(int stationId, int nextStationId, int lineId, int mode)
{
    // 提前返回,减少嵌套层级
    if (stationId == 0)
        return 0;

    int order = _orderRepository.GetOrder(nextStationId, lineId);

    // 注意:原代码此处赋值后会被后续逻辑覆盖,若mode=1需优先返回该结果,应改为直接return
    if (mode == 1)
        GetNextStationIdInArrival(lineId, order);

    // 元组解构替代Item2,提升可读性
    var (_, orderminusOne) = Get(stationId, lineId, order);

    // 条件不满足直接返回,避免冗余嵌套
    if (orderminusOne < _orderRepository.LastOrderToModeBack(lineId))
        return 0;

    // 三元运算符简化最后一组判断
    return order != 0 
        ? _orderRepository.GetStationId(lineId, orderminusOne) 
        : (int?)0;
}

优化要点

  • 提前返回:把stationId == 0的判断放在最前面直接返回,消除外层嵌套,逻辑更直观
  • 命名规范:调整为C#通用的camelCase命名(局部变量、参数),提升代码可读性
  • 元组解构:用var (_, orderminusOne)替代Item2,明确取值含义,避免魔法下标
  • 消除冗余赋值:去掉反复赋值的nextStationid变量,直接返回结果,避免不必要的变量覆盖
  • 简化逻辑:用三元运算符替代最后一组if-return,分支逻辑更紧凑

潜在逻辑修复

原代码中mode == 1时赋值的nextStationid会被后续逻辑覆盖,这大概率是逻辑错误。如果mode == 1需要优先返回该方法结果,应修改为:

if (mode == 1)
    return GetNextStationIdInArrival(lineId, order);

是否适合用switch语句?

当前场景下mode只有一个判断分支(mode == 1),用switch完全没必要,反而会增加代码冗余。但如果后续mode会扩展更多取值(比如mode=2、mode=3对应不同分支逻辑),switch会比多个if-else更清晰易维护。就当前逻辑而言,单个if判断已经足够简洁。


内容的提问来源于stack exchange,提问作者Zeynab Rostami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 19:45:01