如何优化这段嵌套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
相关产品推荐
相关产品推荐

