单行 "if" 语句中,把大括号放在语句同一行上是否不规范?

10

我知道在 if、for 等语句中总是包含花括号被认为是一种相对不错的做法,尽管如果后面只有一条语句时可以选择不加。原因在于这样可以避免出现不小心写成以下情况的状况:

if(something == true)
    DoSomething();
    DoSomethingElse();

如果你在快速编辑代码时不加括号,会怎样呢?

但是像这样的东西呢:

if(something == true)
{   DoSomething(); }

这样可以减少代码行数,提高可读性,同时也能避免由于疏忽而造成的错误吗?

我问这个问题是因为我以前从未见过if或循环中使用这种风格,但我确实看到在C#属性的getter和setter中使用它:

public string Name 
    {get;set;}

不是询问什么是最好的,因为那太主观了,而是询问这是否被认为是可接受的风格,如果不是,为什么不是。

21个回答

20

当我遇到一行if语句时,通常跳过花括号并将所有内容放在同一行:

if (something == true) DoSomething();

它快速、简便且节省空间。


3
我很难接受那种风格。这意味着如果我看到一个“如果”的话,我现在需要查看两个位置才能知道它的作用。 - Roger Lipscombe

10

与其:

if(something == true)
{   DoSomething(); }

这样做:

if(something == true) {   DoSomething(); }

11
不要这样做。我知道这是一个C#问题,我也知道在Visual Studio调试器中将其分解为两个单独的语句进行步进,但在其他语言或调试器中,当你跨越那一行时,"then"子句是否执行并不总是清楚的。这可能非常模棱两可。 - Brian Ensink
如果可以的话,我会给这个评论点赞,并将其作为答案。 - Davy8

9

我倾向于将开括号放在自己的一行,就像这样:

if (condition)
{
   statement;
   statement;
}

因此,如果看到类似以下内容的东西:
if (condition)
   statement;
   statement;

立即显得错误。如果我只有一个语句,我会将其保留为

if (condition)
   statement;

如果我有额外的语句需要添加,稍后再加上大括号。我并没有看到任何混淆的空间。

将语句放在条件的同一行是一个不好的习惯,因为当您进行调试时,大多数调试器会将整个东西视为一行。(我意识到在C#中不是这种情况)。


6
个人而言,我喜欢所有的代码块都有相同的模式。我总是使用大括号来表示if语句,并且它们总是从新一行开始。我喜欢用自动定义公共属性的习惯用法,在同一行上放置{ get; set; }。我只是觉得,让所有的代码块都从自己的一行开始可以提高可读性。正如其他人指出的那样,如果你在调试器中逐行执行代码,这也会使它更清晰。
如果你不同意,那也没关系,但正如其他人所说的那样,要保持一致。为此,你可能希望将“代码格式设置”与你的同事共享,以便自动格式化可以使每个人的代码风格保持一致。
我的做法是:
if (something)
{
   DoSomething();
}

并且

public string MyProperty { get; set; }

6
如果您在团队中工作,您需要制定一个标准。 个人而言,我喜欢这样做:
if(foo)
    DoSomething();

或者

if(foo) DoSomething();

我认为不使用大括号没有问题。人们提出的理由,像你提到的在下一行添加语句,这是我从未遇到过的。


我遇到过很多次这种情况。你想在这个位置放一个调试打印,说foo此时为真,结果如果foo为真,你就打印了foo,但无论foo的值如何,都会执行DoSomething。 - Nathan Fellman

6
许多人建议将两者放在同一行上。这可能会增加可读性,但以我看来会降低调试能力。我已经逐步分析了许多采用这种写法的代码,发现由于这种写法而导致的调试难度更大。
有些调试器和IDE可能能够跨越单行的if语句的两个部分,并清楚地显示条件是否为真,但是许多其他调试器可能将其视为单行,因此很难确定if语句的主体是否被调用。
例如,用于C++代码的VS2008调试器将其作为单行跳过,使得很难确定是否调用了Foo()函数。
if (a==b) { Foo(); }

3

我认为可以。我也用它来编写简短的函数。

在编程风格方面,它比难以言喻的那种方式要好得多:

  if (something== true)   {
      DoSomething();
  }

但是,既然我们谈到了样式,那么

  if (something)

and

  if (!something)

从不

  if (something== true)  

或者

  if (something== false) 

1
那种风格为什么难以言说? - Ken Ray
1
就大括号而言,我赞同Ken的观点 - 我认为不可言喻的东西很好。在将事物与“true”进行比较方面,我支持Jonni的观点,但这不仅仅是多余的 - 它是一个等待发生的错误。 - Michael Burr
你必须给布尔值取一个直观的名字,比如“isSomething”,这样当你在脑海中“读取”它时就会有意义。 - Chet
在没有本地布尔类型的编程语言中,例如C语言,那么如果(something)是模棱两可的。这就是为什么不建议这么做。 - staticsan
在我看来,如果(IsSomething == false)会更好。对于容易出错的人类眼睛来说,很容易忽略那个孤独的感叹号(或者根据你所使用的英语版本,是bang)。 - Mark Withers
显示剩余3条评论

3

这样你仍然可以占据更少的行数(我认为这会增加可读性)

我不同意减少换行符会增加可读性。代码的布局应该使其结构更明显,而不是隐藏它。


Florin,也许你可以编辑你的回答,在单词之间添加空格? - DOK
我同意DOK的观点。他有空格,并没有说要省略空格,只是让代码行数更少。 - Aaron Smith
所以...根据他的说法,我们应该...嗯...将每个单词写在不同的行上...这是他的意思吗? - Newtopian
我的原始信息没有在单词之间添加空格,以此来表明减少语法量并不一定提高代码的可理解性。这种格式是有意为之的,因此我不同意DOK和Shy的观点。 - florin

2

昨天我在处理别人写的代码时遇到了这个问题。原始代码如下:

if (something == true) 
    DoSomething();

在调用DoSomething()之前,我希望你能提供一个调试打印。我的直觉是这样做的。

if (something == true) 
    print("debug message");
    DoSomething();

这样会使if语句只应用于调试信息,而DoSomething()将无条件调用。所以我更喜欢使用花括号,这样本能的编辑结果将会是:

if (something == true) {
    print("debug message");
    DoSomething();
}

1
当您添加调试打印时,请添加大括号。如果不必要,就没有理由将它们放在周围。 - ahawker
1
很好的观点,除了当我添加调试打印时,我不想再担心大括号。我希望尽可能少地进行更改,并仍然获得调试信息而不破坏程序。 - Nathan Fellman

1

换行、缩进、空格、对齐等形式的空白是排版中重要的方面,被广泛应用于提高文章、书籍和网站文本的可读性。不确定为什么它不能同样适用于代码的可读性。

话虽如此,如果你和你的团队都同意使用自己的风格,那就没有问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接