代码风格的如何缩进
在有关代码风格的问题中,最为显眼的可以说就是代码的缩进(Indent)了。所谓缩进,是通过在每一行的代码左端空出一部分长度,更加清晰地从外观上体现出程序的层次结构。为了更好地描述这一点,先请读者欣赏下列这段代码:
int kmp_match(char[] t, char[] p, int[] flink, int n, int m)
{
int i = 0, j = 0;
while (i < n)
{
while (j != -1 && p[j] != t)
{
j = flink[j];
}
if (j == m - 1)
{
return i - m + 1;
}
i++;
j++;
}
return -1;
}
我想,就算让你检查一下它里面有没有大括号配对错误恐怕都很困难,更不用说这段代码有什么功能 了——你能一眼看清楚每个while循环的内容是什么吗?让我们换个方式,看看另一段程序:
代码示例1-15:正确缩进的例子
int kmp_match(char[] t, char[] p, int[] flink, int n, int m)
{
int i = 0, j = 0;
while (i < n)
{
while (j != -1 && p[j] != t)
{
j = flink[j];
}
if (j == m - 1)
{
return i - m + 1;
}
i++;
j++;
}
return -1;
}
两段程序,除了缩进的区别以外,一字不差。孰是孰非,相信大家都能看得出来,缩进的必要性不难理解。接下来的问题就是:应该如何缩进。 当遇到有关命名空间、类、结构、函数、以及枚举等等复杂程序结构的定义的时候,我们通常需要将它的内容缩进一层。在C# 语言中,大括号是一个非常明显的标志,凡是遇到大括号,都应该直接联想到缩进。请看下面的示例:
代码示例1-16:包含关系下的缩进
namespace MyNamespace
{
// 命名空间内的内容应缩进
public class MyClass
{
// 类的成员应缩进
public string MyMethod()
{
// 方法函数的函数体应缩进
return Hello!;
}
private MyEnum myProperty = MyEnum.Alpha;
public MyEnum MyProperty
{
// 属性的内容应缩进
get
{
// 属性的get部分函数体应缩进
return myProperty;
}
set
{
// 属性的set部分函数体应缩进
myProperty = value;
}
}
}
public enum MyEnum
{
// 枚举类型内容应缩进
Alpha,
Beta,
Gamma
}
}
分支结构(包括if…else结构、switch结构等)和循环结构(包括for结构、while/do…while结构等)都是存在嵌套关系的,因此从条理清晰的角度来说,它同样应该进行缩进书写:
代码示例1-17:嵌套关系下的缩进
// if...else结构
if (a > b)
{
// if 子句的结构体内容应缩进
max = a;
min = b;
}
else
{
// else 子句的结构体内容应缩进
max = b;
min = a;
}
// switch结构
switch (n)
{
// switch结构的内容应缩进
case 0:
// case 子句内容也应缩进
// ...
break;
case 1:
// ...
break;
default:
// ...
break;
}
// for结构
for (int i = 0; i < 100; i++)
{
// for 的循环体应缩进
s += data;
t *= data;
}
// while结构
i = 0;
while (data != 0)
{
// while 的循环体应缩进
s += data;
t *= data;
i++;
}
缩进时,应将内部结构中的所有语句都统一向右退一格,大括号则与原来的语句保持在同一个垂直位置上。每层缩进的长度应该一致,通常为一个制表符宽或四个空格。
还有一些细节的地方也与换行相关,例如if、switch、for这类具有嵌套结构的语句,在书写的时候都应避免将结构体与语句本身写在同一行上,关于嵌套结构的书写方法,我们会在后面的章节中详细讨论。 我们在前面提到过,当一条语句太长而超出一定的宽度时,应该折行书写。此时,从第二行起到该语句结束之间的各行应该缩进一层,至下一条语句时再恢复原来的缩进位置。
代码示例1-18:因换行而产生的缩进
int myVar = 0;
// 这是一条很长的语句,因而出现了换行,从第二行起都缩进了一格:
myVar = myVar1 + myVar2 + myVar3 - myVar4 - myVar5 * myVar6 * myVar7 /
myVar8 / myVar9 + myVar10 + myVar11 - myVar12 - myVar13 * myVar14 *
myVar15 / myVar16;
// 后面的语句恢复正常的缩进位置
Console.Write(myVar);
如果该语句是进行函数调用,由于参数太多而造成的换行,那么在缩进规则上有一些微小的差别:
代码示例1-19:函数调用时分行书写参数而引起的缩进
Rectangle imageBounds = new Rectangle(
itemBounds.X + padding,
itemBounds.Y + padding,
itemBounds.Width - padding * 2,
itemBounds.Width - padding * 2
);
注意最后一行的括号与分号并没有缩进,因为这种结构其实是对类似if的大括号嵌套结构的模拟。 如何缩进一向是一个有争议的问题。使用Tab及Shift + Tab键缩进在操作上非常方便,而使用空格可以保证代码在任何编辑器下都能正确显示缩进格式。现在,我们依靠Visual Studio开发环境则可以轻松解决这个矛盾:在“选项”对话框中对C# 编辑器的代码缩进方式进行设置(如图1-2),选择“插入空格”模式。
图1-2:Visual Studio中关于代码缩进的设置
这样一来,我们就可以在书写代码时使用Tab键和Shift + Tab键来调整缩进,而Visual Studio会将其转换为空格保存至代码文件中。
2024-07-20 广告