C# 代码审查:检查什么以及如何提供反馈
\n代码审查是提升代码质量最强大的工具之一。对于初学 C# 的开发者来说,这常常让人感到压力:害怕自己的代码被批评,或者不清楚在别人的代码中应该寻找什么。实际上,好的代码审查是一场对话,而不是一场考试。在本文中,我们将分析在审查 C# 代码(尤其是在 .NET 生态系统中)时应注意什么,以及如何表述意见,使其具有帮助性而非冒犯性。
\n\n1. 在 C# 代码中检查什么:审查者清单
\n当你打开同事的 pull request (PR) 时,可能会眼花缭乱。为了避免陷入细节,请使用系统化的方法。以下是任何 C# 项目中需要检查的关键领域。
\n\n1.1. 架构与可读性
\n首先评估整体情况。回答以下问题:
\n- \n
- 这段代码是否解决了既定任务? \n
- 它是否重复了现有逻辑(DRY 原则)? \n
- 类、方法和变量的命名是否清晰? \n
不好的例子:
\npublic void DoStuff(int a, int b)\n{\n var x = a + b;\n // ... 还有 50 行代码\n}\n好的例子:
\npublic int CalculateTotalPrice(int basePrice, int taxAmount)\n{\n return basePrice + taxAmount;\n}\n方法和参数的名称直接说明了其用途。这降低了读者的认知负荷。
\n\n1.2. 错误处理与空值安全
\nC# 是一种类型系统发达的语言,但 NullReferenceException 是一个常见问题。请检查:
\n- \n
- 是否使用了空值检查(
?.,??,??=)? \n - 在必要的地方是否有异常处理(try-catch)? \n
- 异常是否在空的 catch 中被吞掉? \n
危险代码示例:
\nvar user = GetUserById(id);\nConsole.WriteLine(user.Name); // 如果 user == null 会出错\n安全版本:
\nvar user = GetUserById(id);\nConsole.WriteLine(user?.Name ?? "访客");\n\n1.3. 性能与 LINQ
\nLINQ 很方便,但可能效率不高。请检查:
\n- \n
- 是否对集合进行了多次遍历(例如,在 IQueryable 上使用
.Where().Select().ToList())? \n - 是否使用
Any()代替Count() > 0来检查元素是否存在? \n - 在链式调用中间是否有不必要的物化操作(
.ToList(),.ToArray())? \n
不好的例子:
\nvar list = items.Where(x => x.IsActive).ToList();\nvar first = list.FirstOrDefault();\n更好的做法:
\nvar first = items.FirstOrDefault(x => x.IsActive);\n\n1.4. 异步与 Task
\n在 .NET 中,异步是标准做法。请注意:
\n- \n
- 异步调用前是否遗漏了
await? \n - 在同步上下文中是否有阻塞调用(
.Result,.Wait())? \n - 是否遵循了约定:异步方法以
Async结尾? \n
反模式:
\nvar data = GetDataAsync().Result; // 可能导致死锁\n正确做法:
\nvar data = await GetDataAsync();\n\n2. 如何提供反馈:温和但具有建设性
\n即使有完美的清单,如果你的评论听起来像批评,那也是无用的。以下是一些规则,可以帮助让代码审查对每个人都有益。
\n\n2.1. 使用“我”字句和提问
\n不要说“你写了糟糕的代码”,而是说“我觉得这个方法可以简化。你觉得呢?”。
\n表述示例:
\n- \n
- “我不确 \n