C# 代码审查:检查什么以及如何向新手提供反馈

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C# 代码审查:检查什么以及如何提供反馈

\n

代码审查是提升代码质量最强大的工具之一。对于初学 C# 的开发者来说,这常常让人感到压力:害怕自己的代码被批评,或者不清楚在别人的代码中应该寻找什么。实际上,好的代码审查是一场对话,而不是一场考试。在本文中,我们将分析在审查 C# 代码(尤其是在 .NET 生态系统中)时应注意什么,以及如何表述意见,使其具有帮助性而非冒犯性。

\n\n

1. 在 C# 代码中检查什么:审查者清单

\n

当你打开同事的 pull request (PR) 时,可能会眼花缭乱。为了避免陷入细节,请使用系统化的方法。以下是任何 C# 项目中需要检查的关键领域。

\n\n

1.1. 架构与可读性

\n

首先评估整体情况。回答以下问题:

\n
    \n
  • 这段代码是否解决了既定任务?
  • \n
  • 它是否重复了现有逻辑(DRY 原则)?
  • \n
  • 类、方法和变量的命名是否清晰?
  • \n
\n

不好的例子:

\n
public void DoStuff(int a, int b)\n{\n    var x = a + b;\n    // ... 还有 50 行代码\n}
\n

好的例子:

\n
public int CalculateTotalPrice(int basePrice, int taxAmount)\n{\n    return basePrice + taxAmount;\n}
\n

方法和参数的名称直接说明了其用途。这降低了读者的认知负荷。

\n\n

1.2. 错误处理与空值安全

\n

C# 是一种类型系统发达的语言,但 NullReferenceException 是一个常见问题。请检查:

\n
    \n
  • 是否使用了空值检查(?. , ??, ??=)?
  • \n
  • 在必要的地方是否有异常处理(try-catch)?
  • \n
  • 异常是否在空的 catch 中被吞掉?
  • \n
\n

危险代码示例:

\n
var user = GetUserById(id);\nConsole.WriteLine(user.Name); // 如果 user == null 会出错
\n

安全版本:

\n
var user = GetUserById(id);\nConsole.WriteLine(user?.Name ?? "访客");
\n\n

1.3. 性能与 LINQ

\n

LINQ 很方便,但可能效率不高。请检查:

\n
    \n
  • 是否对集合进行了多次遍历(例如,在 IQueryable 上使用 .Where().Select().ToList())?
  • \n
  • 是否使用 Any() 代替 Count() > 0 来检查元素是否存在?
  • \n
  • 在链式调用中间是否有不必要的物化操作(.ToList(), .ToArray())?
  • \n
\n

不好的例子:

\n
var list = items.Where(x => x.IsActive).ToList();\nvar first = list.FirstOrDefault();
\n

更好的做法:

\n
var first = items.FirstOrDefault(x => x.IsActive);
\n\n

1.4. 异步与 Task

\n

在 .NET 中,异步是标准做法。请注意:

\n
    \n
  • 异步调用前是否遗漏了 await?
  • \n
  • 在同步上下文中是否有阻塞调用(.Result, .Wait())?
  • \n
  • 是否遵循了约定:异步方法以 Async 结尾?
  • \n
\n

反模式:

\n
var data = GetDataAsync().Result; // 可能导致死锁
\n

正确做法:

\n
var data = await GetDataAsync();
\n\n

2. 如何提供反馈:温和但具有建设性

\n

即使有完美的清单,如果你的评论听起来像批评,那也是无用的。以下是一些规则,可以帮助让代码审查对每个人都有益。

\n\n

2.1. 使用“我”字句和提问

\n

不要说“你写了糟糕的代码”,而是说“我觉得这个方法可以简化。你觉得呢?”。

\n

表述示例:

\n
    \n
  • “我不确
  • \n

博客

书籍推荐