这不是一场圣战,这不是"哪个更好"的问题.
如果块,使用以下格式的单个语句有什么优点.
if (x) print "x is true"; if(x) print "x is true";
相反
if (x) { print "x is true"; } if(x) { print "x is true"; }
如果您将单个语句格式化为无括号或者知道程序员是什么,那么是什么导致您/他们首先采用这种风格?我特别感兴趣的是这给你带来了什么好处.
更新:由于最受欢迎的答案忽略了实际问题(即使它提出了最合理的建议),这里是一个无支架专业人员的综述.
紧凑
一些人更可读
括号调用范围,在某些情况下具有理论开销
Matt Dillard.. 49
我发现这个:
if( true ) { DoSomething(); } else { DoSomethingElse(); }
比这更好:
if( true ) DoSomething(); else DoSomethingElse();
这样,如果我(或其他人)稍后回到此代码以向其中一个分支添加更多代码,我将不必担心忘记用括号括起代码.我们的眼睛会在视觉上看到缩进作为我们想要做的事情的线索,但大多数语言都没有.
我发现这个:
if( true ) { DoSomething(); } else { DoSomethingElse(); }
比这更好:
if( true ) DoSomething(); else DoSomethingElse();
这样,如果我(或其他人)稍后回到此代码以向其中一个分支添加更多代码,我将不必担心忘记用括号括起代码.我们的眼睛会在视觉上看到缩进作为我们想要做的事情的线索,但大多数语言都没有.
我非常不喜欢任何将if的测试和身体放在同一条线上的风格.
这是因为共享该行使得在许多调试器中无法在if的主体上设置断点,因为断点通常是基于行号的.
总是使用大括号是一个好主意,但标准答案总是给出"如果有人添加一行代码并忘记添加大括号会怎么样?" 是一个相当薄弱的原因.
有一个微妙的错误,可以通过从一开始就没有括号引入.它发生在我身上几次,我发现它发生在其他程序员身上.
用一个简单的if语句开始,天真无邪.
if (condition) do_something(); else do_something_else();
这一切都很好.
然后有人来了,并为if添加了另一个条件.他们无法使用&&将其添加到if语句本身,因为逻辑不正确,因此他们添加了另一个if.我们现在有:
if (condition) if (condition2) do_something(); else do_something_else();
你看到了问题吗?它可能看起来正确,但编译器看到的方式不同.它看起来像这样:
if (condition) if (condition2) do_something(); else do_something_else();
这意味着完全不同的东西.编译器不关心格式化.其他与最近的if一起去.另一方面,人类依赖于格式化,很容易错过这个问题.
我总是用
if(x) { print "x is true"; }
如果他们在当前行之后添加一行,那么遗漏大括号可能会导致有人错误地认为他们正在添加if子句.
我用
if (x) { DoSomething(); }
对于多行,但我更喜欢无支架的一个衬垫:
if (x) DoSomething(); else DoSomethingElse();
我发现无关的括号在视觉上令人反感,而且在添加另一个语句时,我从未犯过上述错误之一而不添加括号.
if { // code } else { // else code }
因为我喜欢代码块排队(包括他们的大括号).
如果我编码:
if(x) print "x is true";
并且6个月之后需要添加一个新的线条,花括号的存在使我输入的可能性大大降低
if(x) print "x is true"; print "x is still true";
这会导致逻辑错误,而不是:
if(x) { print "x is true"; print "x is still true"; }
我发现,如此花括号使得这些逻辑错误更易于阅读和避免.
像马特(上面3),我更喜欢:
if (x) { ...statement1 ...statement2 }
和
if (x) ...statement else ...statement
我觉得很奇怪,以为有人可能会在以后出现并且没有意识到他们必须添加大括号以形成多行if块.如果这超出了他们的能力,我想知道其他的东西是什么!
如果块缺少大括号,则单个语句:
优点:
字符更少
清洁的样子
缺点:
均匀性:并非所有块看起来都一样
在向块添加语句时可能存在错误:用户可能忘记添加大括号,if语句不会覆盖新语句.
如:
if(x) print "x is true"; print "something else";
当我在函数开始时测试中断条件时,我倾向于只使用单行,因为我希望保持这段代码尽可能简单和整洁
public void MyFunction(object param) { if (param == null) return; ... }
另外,如果我发现我确实想要避免使用大括号并内联if子句代码,我可以对它们进行单行处理,这样对于任何添加新行的人都很明显,如果需要添加括号