将大括号放在与单行“if”语句的语句相同的行上是不是很糟糕?

时间:2008-10-31 20:33:27

标签: c# language-agnostic coding-style

所以我知道,总是在if,for等中包含花括号被认为是一种好的做法,即使它们是可选的,如果只有一个后面的语句,因为它更容易意外地执行以下操作:

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

如果你没有放大括号,快速编辑代码。

虽然这样的事情怎么样:

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

这样你仍然占用更少的线(IMO提高了可读性)但是仍然不太可能从上面意外地犯错误?

我问,因为我不相信我以前见过这种风格的if或循环,但我确实看到它用于C#属性中的getter和setter:

public string Name 
    {get;set;}

不要问什么是最好的,因为这太主观了,而只是这是否会被认为是可接受的风格,如果没有,为什么不呢。

21 个答案:

答案 0 :(得分:20)

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

if (something == true) DoSomething();

快速,简单,节省空间。

答案 1 :(得分:10)

而不是:

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

这样做:

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

答案 2 :(得分:9)

我倾向于在自己的行上打开括号:

if (condition)
{
   statement;
   statement;
}

所以看到类似的东西:

if (condition)
   statement;
   statement;

立即脱颖而出。如果我只有一个陈述,我就把它留作

if (condition)
   statement;

如果我有一个额外的声明要添加,请将括号放入。我真的没有看到任何混淆的余地。

将语句放在与条件相同的行上是一个不好的习惯,因为在调试时,大多数调试器将整个事件计为一行。 (我意识到在C#中并非如此)。

答案 3 :(得分:6)

很多人建议将两者放在一条线上。这可能会增加可读性,但代价是我认为调试能力下降。我已经通过这种方式编写了大量代码,因此很难进行调试。

某些调试器和IDE可能能够跨越单行if - 语句的两个部分,并清楚地显示条件是否为真,但许多其他调试器可能将其视为单行,使其变得困难确定是否调用了if - 语句的正文。

例如,用于C ++代码的VS2008调试器将作为单行替换它,因此很难确定是否调用了Foo()。

if (a==b) { Foo(); }

答案 4 :(得分:6)

如果你在团队中工作,你需要提出一个标准。

我个人喜欢这样做:

if(foo)
    DoSomething();

if(foo) DoSomething();

我没有看到没有牙箍的问题。人们引用的原因,你提到的关于在下面的行中添加另一个陈述的那个,是我从来没有参与过的那个。

答案 5 :(得分:5)

就个人而言,我喜欢我所有的积木都有相同的模式。我总是使用ifs的大括号,他们总是开始新的一行。我喜欢自动定义放置{get;的公共属性的习语。组;在同一条线上。我只是觉得所有的块都以自己的支撑开始,提高了可读性。正如其他人所指出的那样,如果你跨越线路,它也会使调试器更清晰。

如果你不同意,那也没关系,但正如其他人所说的一致。为此,您可能希望在您和您的同事之间共享“代码格式”设置,以便自动格式化使每个人都能保持一致。

我愿意:

if (something)
{
   DoSomething();
}

public string MyProperty { get; set; }

答案 6 :(得分:3)

  

这样你仍然占用更少的线(IMO提高了可读性)

我不同意断线次数减少会增加可读性。代码的布局应该使其结构更加可见,而不是隐藏它。

答案 7 :(得分:3)

我不明白为什么不。我也用它来做短功能。

在进攻风格方面,它远比无法形容的好:

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

但是,虽然我们谈论的是风格,但它是

  if (something)

  if (!something)

从不

  if (something== true)  

  if (something== false) 

答案 8 :(得分:2)

我昨天在处理其他人编写的代码时遇到了这个问题。原始代码是:

if (something == true) 
    DoSomething();

我在调用DoSomething()之前想要一个调试打印。我本能地做什么

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

但这会使if仅适用于调试消息,而DoSomething()将无条件地调用。这就是为什么我宁愿使用花括号,以便本能编辑最终成为:

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

答案 9 :(得分:1)

新行,缩进,间距,对齐等形式的空白是排版的一个重要方面,广泛用于提高文章,书籍和网站中文本的可读性。不确定为什么它不会对代码的可读性应用相同的内容。

话虽如此,你和你的团队使用你的风格并没有错。只要你们所有人都同意的话。

答案 10 :(得分:0)

只要你保持一致就不应该成为一个问题。在以前的公司,这是典型的情况,但在我现在的公司,他们更喜欢在单独的线路上使用括号。

答案 11 :(得分:0)

我建议你像Stephen和Nicholas Mancuso那样说。

使用:

if(something) {   DoSomething(); }

有无支架。一旦你开始使用奇怪版本的“if”语句,你就会开始看到你的同事以一种奇怪的方式看你的代码。

我通常使用一个衬垫进行验证。

示例:

if( param1 == null ) throw new ArgumentNullException("param1");

答案 12 :(得分:0)

如果您真的想保存代码行,可以这样输入:

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

或者这个,没有大括号

if(something == true) DoSomething(); 

答案 13 :(得分:0)

那里没有问题......事实上,如果您尝试自动格式化,Visual Studio将不会将该代码放在它自己的行上。所以,如果那对你更具可读性......你很好。

答案 14 :(得分:0)

只要你始终如一地做到这一点,并确保每个处理代码的人都知道你是如何做到的,那么你做什么并不重要。

做你觉得最舒服的事情,然后确保每个人都知道总是这样做。

答案 15 :(得分:0)

实际上,我更喜欢

if (something == true)
if (something == false)

if (something)
if (!something)

对我来说,感叹号一眼就难以看清,所以容易错过。但请注意,当我在Python中编码时,我几乎总是喜欢:

if something:
if not something:

除非我想区分无,例如空列表。

答案 16 :(得分:0)

我偶尔会喜欢这样做

if(obj != null) obj.method();

但这是一种内疚的快感......我不认为它使代码更具可读性,所以为什么不遵循其他人使用的模式。我认为非常重要的一个例外是当你展示它是如何成为更大模式的一部分,并帮助用户更容易地看到模式时:

public executeMethodOn(String cmd) {
  CommandObject co;

  if("CmdObject1".equals(cmd)) co=new CmdObject1();
  if("CmdObject2".equals(cmd)) co=new CmdObjec21();

  co.executeMethod();
}

它使模式更加明显,并帮助尝试插入新功能的人看到它需要去的地方。

那就是说,如果你曾经有这样的模式,你可能做错了。我不得不在一个没有反射的系统上做这个,但我试着真的很难解决它,如果我有反思,那就太棒了。

答案 17 :(得分:0)

我通常使用单行ifs执行此操作:

if($something) {
    do_something();
}

一个例外(我做Perl,不确定C#中是否允许这种样式)是用于循环控件,我使用倒置的一行样式:

THING:
for my $thing (1 .. 10) {
    next THING if $thing % 3 == 0;
}

通过良好的语法着色,可以使这些线条突出显示。

答案 18 :(得分:0)

你的错误都错了!!!!! ; - )

幸运的是,只需更换每个文件中的最后一个大括号,VS就会将您所有的疯狂重新格式化为我个人认可的格式。

空白是一种风格的东西。由于我们有不同的阅读风格和学习风格,所以你的工作方式无关紧要。这些工具可以让我们来回切换。我注意到的唯一缺点就是跟踪源控制中的变化所需的代价。当我将K& R样式文件重新格式化为更合理的格式(我的意见)并检查更改回源代码控制时,它几乎显示每行都已更改。那是一种痛苦。但是许多diff实用程序可以忽略空白更改(尽管大多数只在一行上,而不是跨越行)。这是一个问题。但不是表演的终结者。

答案 19 :(得分:0)

C在格式化问题上给予了很大的自由,因此将它们放在同一行或不同的行中与编译目的无关。

因此,“它会不好”仅指编码约定。这取决于具体情况。如果您在团队中工作,最好向其他人询问他们的想法并提出标准的格式化风格。如果没有,那真的取决于你。

所以,如果你认为它更好,那就继续吧。如果没有,那就不要了。它真的很简单(除非你使用一个强加一些样式约定的IDE)

答案 20 :(得分:0)

我更喜欢那种令人难以置信的语法:

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

是的,这就是K& R做到的方式......是的,我回到那么远......是的,这对我来说已经足够了。这意味着即使我这样做,我也会得到通用语法:

if (-1 == doSomething()) {
   doSomethingElse();
}

无论它们包含的代码行数是多少,我都将花括号括起来。我被“需要添加一行测试代码”所困扰,并且多次错过了花括号的缺失。

我总是与左边的文字进行比较。这避免了“测试分配”错误(例如if(something = true){...})。

“(= = true)”的可移植性没有比在布尔比较中使用重载的值集合表示“true”和“false”的危险更大的危险 - 但它是一种不同的类型危险。您是否使用将“空”(和/或零和/或NULL和/或空格)视为“真”或“假”的语言编写?我更喜欢一种对每种情况都安全的惯例......因为我很懒。