C# 中的 Code Review:检查什么以及如何提供反馈
Code Review 不仅仅是一种形式,而是确保代码质量的关键流程之一。这对于 C# 和 .NET 项目尤其重要,因为高性能、可读性和符合现代标准起着决定性作用。在本文中,我们将分析在审查 C# 代码时应注意什么,以及如何提供有用且建设性的反馈。
1. 架构与 SOLID 原则的符合性
在查看具体代码行之前,先评估整体架构。在 C# 中,由于广泛使用 OOP,这一点尤为重要。
- 单一职责:每个类和方法应只解决一个问题。如果方法做得太多,这就是审查的理由。
- 开闭原则:检查是否可以在不修改现有代码的情况下扩展功能(例如,通过接口或抽象类)。
- 依赖注入:在 .NET Core/5+ 中,DI 是标准。确保依赖项通过构造函数传递,而不是在类内部创建。
// 不好:违反 SRP 和 DIpublic class OrderService{ private readonly SqlConnection _connection = new SqlConnection("..."); public void ProcessOrder(Order order) { // 验证逻辑 // 保存到数据库的逻辑 // 发送电子邮件的逻辑 }}
// 好:分离为服务并使用 DIpublic class OrderService{ private readonly IOrderRepository _orderRepository; private readonly IEmailService _emailService;
public OrderService(IOrderRepository orderRepository, IEmailService emailService) { _orderRepository = orderRepository; _emailService = emailService; }
public void ProcessOrder(Order order) { _orderRepository.Save(order); _emailService.SendConfirmation(order); }}2. 安全性与错误处理
安全性是任何 C# 应用程序的关键部分。请注意以下方面:
- SQL 注入:使用参数化查询或 Entity Framework,而不是字符串拼接。
- 异常:不要用空的
catch吞掉异常。记录错误并使用finally释放资源。 - 空值安全性:在 C# 8+ 中使用可为空引用类型。检查方法参数是否为
null。
// 不好:容易受到 SQL 注入攻击var query = "SELECT * FROM Users WHERE Name = '" + userName + "'";
// 好:参数化查询var command = new SqlCommand("SELECT * FROM Users WHERE Name = @name", connection);command.Parameters.AddWithValue("@name", userName);同时检查应用程序在系统边界(例如 ASP.NET Core 控制器中)是否正确处理异常。
3. 性能与内存管理
C# 是一种具有自动内存管理的语言,但这并不意味着可以忘记性能。在审查时请注意:
- LINQ 查询:避免对集合进行多次迭代。例如,在每个
.Where()之后使用.ToList()可能会严重降低性能。 - 异步:对 I/O 操作使用
async/await,但不要滥用.Result或.Wait()——这可能导致死锁。 - 对象池:对于重量级对象(例如数据库连接),使用对象池而不是每次都创建它们。
// 不好:多次迭代var filtered = items.Where(x => x.IsActive).ToList();var sorted = filtered.OrderBy(x => x.Name).ToList