Skip to content
On this page

使用空格

印刷和 Web 设计师明白,在一个小型空间中放置太多信息会使阅读者眼花缭乱,因此他们会战略性地使用空格或负空间来分解信息,以最大程度地提高阅读者理解所传达的主要信息的能力。

当开发者在编辑器中编写代码时,他们可以使用类似的策略。通过使用空格传达含义,开发者可以更清楚地传达代码意图。

什么是空格?

术语“空格”指的是由空格键生成的单个空格、由 Tab 键生成的制表符以及由 Enter 键生成的新行。

C# 编译器会忽略空格。要了解如何忽略空格,以及如何使用空格更清楚地传达代码意图,我们来完成以下练习。

添加代码以说明 C# 编译器如何忽略空格

在 .NET 编辑器中添加以下代码:

csharp
// Example 1:
Console
.
WriteLine
(
"Hello World!"
)
;

// Example 2:
string firstWord="Hello";string lastWord="World";Console.WriteLine(firstWord+" "+lastWord+"!");

运行代码。你应获得以下输出:

bash
Hello World!
Hello World!

这两个代码示例说明了两个重要概念:

  • 空格对编译器而言不重要;但...
  • 正确使用空格可以提高你阅读和理解代码的能力。

你可能只需编写一次代码,但需要多次阅读代码。因此,应注重所编写代码的可读性。你会逐渐意识到使用空格(如空格字符、制表符和新行)的好处。

提前指导:

  • 每个完整的命令(语句)都属于单独的一行。
  • 如果单个代码行过长,可以将其拆分。但是,不应随意将单个语句拆分为多行,除非你有充分的理由这样做。
  • 在赋值运算符的左侧和右侧使用空格。

添加代码以开始练习的下一个部分

接下来,我们来演示如何添加空格以创建视觉对象表述,帮助你理解一段代码所执行的操作。我们首先添加不含任何空格的代码。

备注

此步骤中的代码来自“在 C# 中使用 if-elseif-else 语句将决策逻辑添加到代码中”模块。此处进行了大量修改,以强调如何提高代码的可读性。如果你不知道此代码的作用,请不要担心,其他模块会对它进行介绍。现在,注意我们是如何删除空格的,删除空格会使得阅读代码变得非常困难。

csharp
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 键在执行相似或相关操作的两个、三个或四个代码行之间引入空行。

使用垂直空格表述代码是主观操作。不同的开发者可能会在可读性或何时添加空格方面保持不同的意见。请根据你的最佳判断来使用。

向上一步骤中的代码添加三个换行符,如下所示:

csharp
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 下方的代码行,修改上一步中的代码,如下所示:

csharp
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 键将代码块与相关的关键字对齐。
  • 缩进代码块中的代码以显示所有权。