使用空格
印刷和 Web 设计师明白,在一个小型空间中放置太多信息会使阅读者眼花缭乱,因此他们会战略性地使用空格或负空间来分解信息,以最大程度地提高阅读者理解所传达的主要信息的能力。
当开发者在编辑器中编写代码时,他们可以使用类似的策略。通过使用空格传达含义,开发者可以更清楚地传达代码意图。
什么是空格?
术语“空格”指的是由空格键生成的单个空格、由 Tab 键生成的制表符以及由 Enter 键生成的新行。
C# 编译器会忽略空格。要了解如何忽略空格,以及如何使用空格更清楚地传达代码意图,我们来完成以下练习。
添加代码以说明 C# 编译器如何忽略空格
在 .NET 编辑器中添加以下代码:
// Example 1:
Console
.
WriteLine
(
"Hello World!"
)
;
// Example 2:
string firstWord="Hello";string lastWord="World";Console.WriteLine(firstWord+" "+lastWord+"!");运行代码。你应获得以下输出:
Hello World!
Hello World!这两个代码示例说明了两个重要概念:
- 空格对编译器而言不重要;但...
- 正确使用空格可以提高你阅读和理解代码的能力。
你可能只需编写一次代码,但需要多次阅读代码。因此,应注重所编写代码的可读性。你会逐渐意识到使用空格(如空格字符、制表符和新行)的好处。
提前指导:
- 每个完整的命令(语句)都属于单独的一行。
- 如果单个代码行过长,可以将其拆分。但是,不应随意将单个语句拆分为多行,除非你有充分的理由这样做。
- 在赋值运算符的左侧和右侧使用空格。
添加代码以开始练习的下一个部分
接下来,我们来演示如何添加空格以创建视觉对象表述,帮助你理解一段代码所执行的操作。我们首先添加不含任何空格的代码。
备注
此步骤中的代码来自“在 C# 中使用 if-elseif-else 语句将决策逻辑添加到代码中”模块。此处进行了大量修改,以强调如何提高代码的可读性。如果你不知道此代码的作用,请不要担心,其他模块会对它进行介绍。现在,注意我们是如何删除空格的,删除空格会使得阅读代码变得非常困难。
Random dice = new Random();
int roll1 = dice.Next(1, 7);
int roll2 = dice.Next(1, 7);
int roll3 = dice.Next(1, 7);
int total = roll1 + roll2 + roll3;
Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3)) {
if ((roll1 == roll2) && (roll2 == roll3)) {
Console.WriteLine("You rolled triples! +6 bonus to total!");
total += 6;
} else {
Console.WriteLine("You rolled doubles! +2 bonus to total!");
total += 2;
}
}此代码的输出并不重要。我们希望专注于代码的可读性。
需要注意此代码的两个特点:
- 此代码示例中没有垂直空格。换言之,没有分隔代码行的空行。所有内容都整合到一个密集的代码列表中。
- 由左大括号和右大括号
{ }定义的代码块压缩在一起,使其边界难以在视觉上辨别出来。
添加空格以创建表述并提高可读性
一般而言,为了提高可读性,需使用键盘上的 Enter 键在执行相似或相关操作的两个、三个或四个代码行之间引入空行。
使用垂直空格表述代码是主观操作。不同的开发者可能会在可读性或何时添加空格方面保持不同的意见。请根据你的最佳判断来使用。
向上一步骤中的代码添加三个换行符,如下所示:
Random dice = new Random();
int roll1 = dice.Next(1, 7);
int roll2 = dice.Next(1, 7);
int roll3 = dice.Next(1, 7);
int total = roll1 + roll2 + roll3;
Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3)) {
if ((roll1 == roll2) && (roll2 == roll3)) {
Console.WriteLine("You rolled triples! +6 bonus to total!");
total += 6;
} else {
Console.WriteLine("You rolled doubles! +2 bonus to total!");
total += 2;
}
}第一个换行符会将 dice 变量的声明和初始化分隔开。同样,无需担心 Random 类是什么,也无需担心 new 关键字的作用。此内容会在另一个模块中进行介绍。
接下来三行创建 int 类型的三个变量,每个变量具有类似的名称。它们初始化为通过调用 dice.Next(1, 7) 方法返回的值。显然,这些行看起来相似,并且执行类似的操作。
由于第一行和下面四行似乎执行不同的操作,因此可以使用空格将它们分隔开。
接下来,声明另一个名为 total 的变量,并将其初始化为前三个 int 类型的变量的总和。然后,使用 Console.WriteLine() 输出所有四个变量。这两行可以作为短语的一部分,因为它们“协同工作”来完成一个任务。
有些人可能会认为你应该在前两个代码行之间添加一个空行。同样,这由你自己判断。你应该知道哪种样式对你而言更易阅读,并且应该始终使用该样式。
这将保留 if 语句。我们将在下一步中讨论此语句。
将左大括号和右大括号移动到其自己的行,以增加间距
重点关注关键字 if 下方的代码行,修改上一步中的代码,如下所示:
Random dice = new Random();
int roll1 = dice.Next(1, 7);
int roll2 = dice.Next(1, 7);
int roll3 = dice.Next(1, 7);
int total = roll1 + roll2 + roll3;
Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3))
{
if ((roll1 == roll2) && (roll2 == roll3))
{
Console.WriteLine("You rolled triples! +6 bonus to total!");
total += 6;
}
else
{
Console.WriteLine("You rolled doubles! +2 bonus to total!");
total += 2;
}
}{ 和 } 符号可创建代码块。许多 C# 构造都需要代码块。应将这些符号放在单独的行中,以便其边界清晰可见且可阅读。
此外,请务必使用 tab 键使代码块符号在其所属的关键字下方对齐。例如,请注意以关键字 if 开头的代码行。该行下面是 { 符号。这样就可轻松地知道 {“属于”if 语句。此外,最后一个 } 符号也与这些内容对齐。这对于了解代码块的结束位置特别有帮助。
此代码块的内容是缩进的,表示它们“属于”这个外部代码块。
对于内部 if 语句和 else 语句以及这些代码块内部的代码,我们遵循类似的模式。
并非所有人都同意使用此样式,但作为起点,在编写代码时,请使用本指南。然后,你可以有目的地决定在未来何时不希望遵循本指南。
概括
下面是本练习的要点:
- 明智地使用空格来提高代码的可读性。
- 使用换行符来创建空行以分隔代码短语。一个短语由类似或协同工作的代码行组成。
- 使用换行符分隔代码块符号,使其处于自己的代码行中。
- 使用
tab键将代码块与相关的关键字对齐。 - 缩进代码块中的代码以显示所有权。