注释代码
在本练习中,我们将向代码添加注释并暂时禁止某些代码行进行编译。接下来,我们将了解 C# 编译器如何理解空格以及如何使用空格来提高代码的可读性。
什么是代码注释?
代码注释是一条指令,用于指示编译器忽略当前行中代码注释符号后面的一切内容。
// This is a code comment!一开始,这似乎没有用。但它在三种情况下很有用:
- 如果要对一段代码的意图留下说明,在编写一组特别具有挑战性的编码指令时,可以使用代码注释来描述目的或思维过程。将来的你会感谢自己。
- 当你想暂时删除应用程序中的代码,以尝试其他方法,但不确信新想法是否有用时,可以注释禁止代码,并编写新代码。一旦你确定新代码会按预期方式运行时,就可安全地删除旧(注释)代码。
- 可以使用代码注释添加一条消息(例如
TODO),提醒你稍后查看给定的代码段。你应该明智地使用此消息,这是一个有效原因。当阅读到引起你关注的代码行时,你可能正在处理另一项功能。你可以对其进行标记以便稍后调查,而不是忽略关注的新代码行。Visual Studio IDE 甚至提供名为“任务列表”的窗口,以帮助你识别你在代码中记下的TODO消息。
备注
代码注释不可信任。通常,开发人员会更新其代码,但忘记更新代码注释。最好使用注释来描述更高级别的想法,请勿添加关于单个代码行如何工作的注释。
注释掉练习中的代码行
string firstName = "Bob";
int widgetsSold = 7;
Console.WriteLine($"{firstName} sold {widgetsSold} widgets.");接下来,按如下方式修改该代码示例:
string firstName = "Bob";
int widgetsPurchased = 7;
// Testing a change to the message.
// int widgetsSold = 7;
// Console.WriteLine($"{firstName} sold {widgetsSold} widgets.");
Console.WriteLine($"{firstName} purchased {widgetsPurchased} widgets.");现在运行应用程序。你将在输出控制台中看到以下结果:
Bob purchased 7 widgets.请注意,我们使用代码注释记录了可能做出的更改,并在我们测试新消息时暂时禁用了旧消息。如果我们对新代码感到满意,可以安全地删除我们注释禁止的旧代码。在确信准备永久删除工作代码之前,这是一种修改工作代码的更安全、更有条理的方法。
删除注释掉的代码
删除上一步中以代码注释运算符 // 开头的每个代码行。修改代码以使其与以下列表一致:
string firstName = "Bob";
int widgetsPurchased = 7;
Console.WriteLine($"{firstName} purchased {widgetsPurchased} widgets.");输出应保持不变。
使用多行注释
如果你需要编写较长的注释或删除多个代码行,可以通过将 /* 添加到代码开头,将 */ 添加到结尾来注释多行。
/*
This is a long comment
that spans multiple lines
just to prove that it can
be done.
*/将之前编写的修改为与以下代码列表一致:
/*
string firstName = "Bob";
int widgetsPurchased = 7;
Console.WriteLine($"{firstName} purchased {widgetsPurchased} widgets.");
*/运行代码时,你在输出控制台中不会看到任何输出。C# 编译器现在将忽略所有代码。
使用多行注释是禁用三个或以上代码行的最快速、最简单的方式。
将注释质量不佳的代码添加到 .NET 编辑器
使用“运行”按钮,或将以下代码键入或复制到 .NET 编辑器中:
Random random = new Random();
string[] orderIDs = new string[5];
// Loop through each blank orderID
for (int i = 0; i < orderIDs.Length; i++)
{
// Get a random value that equates to ASCII letters A through E
int prefixValue = random.Next(65, 70);
// Convert the random value into a char, then a string
string prefix = Convert.ToChar(prefixValue).ToString();
// Create a random number, padd with zeroes
string suffix = random.Next(1, 1000).ToString("000");
// Combine the prefix and suffix together, then assign to current OrderID
orderIDs[i] = prefix + suffix;
}
// Print out each orderID
foreach (var orderID in orderIDs)
{
Console.WriteLine(orderID);
}备注
此代码列表中可能有许多你非常陌生的 C# 概念。无需为了理解注释如何帮助读者了解代码用途而去了解代码所执行的操作。
:::
在提供注释的情况下,你也许能够明白代码所执行的操作(假设注释准确地说明了当前状态并随着代码一起更新)。
但你能猜一猜此代码为什么存在吗?如果此代码上面有一些关于它的用途解释来提供一些上下文,那不是很有帮助吗?
此代码存在两个问题:
- 代码注释不必要地解释了单独代码行的明显功能。这些被视为低质量的注释,因为它们只解释了 C# 或 .NET 类库的方法如何工作。如果读者不熟悉这些内容,他们可以使用 Microsoft Learn 或 Intellisense 来查阅。
- 代码注释未提供代码所解决问题的任何上下文。这些被视为低质量的注释,因为读者无法了解此代码的用途,尤其是在涉及到更大的系统时。
删除低级别的描述性注释
要改进此代码,首先删除现有注释。
选择并删除以行注释运算符 // 开头的每个代码行。代码应与以下代码列表一致:
Random random = new Random();
string[] orderIDs = new string[5];
for (int i = 0; i < orderIDs.Length; i++)
{
int prefixValue = random.Next(65, 70);
string prefix = Convert.ToChar(prefixValue).ToString();
string suffix = random.Next(1, 1000).ToString("000");
orderIDs[i] = prefix + suffix;
}
foreach (var orderID in orderIDs)
{
Console.WriteLine(orderID);
}添加代码注释以解释代码的更高级别用途
要进一步改进此代码,请添加解释更高级别代码用途的注释。代码应与以下代码列表一致:
/*
The following code creates five random OrderIDs
to test the fraud-detection process. OrderIDs
consist of a letter from A to E, and a three
digit number. Ex. A123.
*/
Random random = new Random();
string[] orderIDs = new string[5];
for (int i = 0; i < orderIDs.Length; i++)
{
int prefixValue = random.Next(65, 70);
string prefix = Convert.ToChar(prefixValue).ToString();
string suffix = random.Next(1, 1000).ToString("000");
orderIDs[i] = prefix + suffix;
}
foreach (var orderID in orderIDs)
{
Console.WriteLine(orderID);
}注释有用与否是一种主观意识。只要与代码可读性相关的事,都应该相信自己最合理的判断。做你认为最能清楚描述代码的事。
概括
下面是本练习的要点:
- 使用代码注释为自己添加有意义的备注,注明代码可解决的问题。
- 请勿使用解释 C# 或 .NET 类库如何工作的代码注释。
- 暂时尝试替代解决方法时,请使用代码注释,直至你已准备提交新的代码解决方案,此时可以删除旧代码。
- 不要完全相信注释。在进行许多更改和更新之后,它们可能不会反映代码的当前状态。