引言:为什么你的代码会让高级开发人员抓狂?
\n\n你提交了一个拉取请求。五分钟过去了。聊天窗口里弹出一条消息:“我们把这个块重写一下怎么样?” 然后每一行代码下面都有十几条评论。熟悉吗?如果你用 C# 编程并在团队中工作,代码审查 不仅仅是 Jira 里的一个勾选框。这是检验真理的时刻。
\n\n我收集了高级开发人员在 C# 代码审查中留下的典型意见。这不是关于语法——而是关于思维方式。关于如何将“仅仅能工作的代码”转变为让人不想在第一个周五就重写的代码。
\n\n让我们开始分析那些让最冷静的技术主管也抓狂的 C# 反模式。
\n\n1. 魔法数字和字符串:“这代表什么意思?”
\n\n在 C# 代码审查 中最常见的评论就是针对数字的提问。你写了 if (status == 3),高级开发人员立刻会问:“这个 3 是什么?是‘处理中’状态还是‘已删除’状态?”
不好的写法:
\nif (order.Status == 3 && days > 7)\n{\n CancelOrder(order);\n}\n\n\n好的写法:
\nprivate const int OrderStatusCancelled = 3;\nprivate const int MaxDaysBeforeAutoCancel = 7;\n\nif (order.Status == OrderStatusCancelled && days > MaxDaysBeforeAutoCancel)\n{\n CancelOrder(order);\n}\n\n\n更好的做法是将其提取为枚举。高级开发人员喜欢可读性强的代码,不需要去查数据库就能理解业务逻辑。这是 C# 代码审查的基本规则:代码应该不言自明。
\n\n2. Async void —— 应用程序的沉默杀手
\n\n如果你在事件处理器(例如 WPF 或 WinForms)之外的地方写了 async void,准备好接受严厉的批评吧。Async void 无法被追踪——异常会消失在虚空中并导致进程崩溃。
不好的写法:
\npublic async void LoadData()\n{\n var data = await _repository.GetDataAsync();\n // 如果这里出错——应用程序会崩溃且没有错误消息\n}\n\n\n好的写法:
\npublic async Task LoadDataAsync()\n{\n var data = await _repository.GetDataAsync();\n}\n\n\n在 C# 代码审查 中,高级开发人员一定会指出这一点。记住:async Task 是你的朋友,async void 是敌人(事件处理除外)。
3. 哥斯拉类:单一职责原则
\n\n你打开一个文件,里面有 2000 行代码。一个类做了所有事情:访问数据库、发送邮件、生成报告,甚至还能煮咖啡。这是经典的 C# 反模式 —— God Object(上帝对象)。
\n\n在 C# 代码审查 中,高级开发人员会说:“我们把它拆分成几个类吧。” 他是对的。
\n\n违反原则的例子:
\npublic class OrderService\n{\n public void ProcessOrder(Order order)\n {\n // 1. 验证\n // 2. 保存到数据库\n // 3. 发送邮件\n // 4. 记录日志\n }\n}\n\n\n正确的做法:
\npublic class OrderProcessor\n{\n private readonly IOrderValidator _validator;\n private readonly IOrderRepository _repository;\n private readonly INotificationService _notificationService;\n\n public OrderProcessor(\n IOrderValidator validator,\n IOrderRepository repository,\n INotificationService notificationService)\n {\n _validator = validator;\n _repository = repository;\n _notificationService = notificationService;\n }\n\n public async Task ProcessOrderAsync(Order order)\n {\n _validator.Validate(order);\n await _repository.SaveAsync(order);\n await _notificationService.SendConfirmationAsync(order);\n }\n}\n\n\n这不仅仅是“好看”。这是可测试的。你可以模拟存储库并仅测试处理逻辑。这种风格的 C# 重构 是任何项目的必备技能。
\n\n4. 将异常用作控制流
\n\n