【问题标题】:Different ways of writing the "if" statement [closed]编写“if”语句的不同方式[关闭]
【发布时间】:2009-03-12 15:27:51
【问题描述】:

我见过写if 声明的不同方式。

你更喜欢哪一个,为什么?

示例 1:

if (val % 2 == 1){output = “Number is odd”;}else{output = “Number is even”;} 

示例 2:

if (val % 2 == 1)
{
    output = “Number is odd”;
}
else
{
   output = “Number is even”;
}

示例 3:

if (val % 2 == 1)
output = “Number is odd”;
else
output = “Number is even”;

示例 4:

if (val % 2 == 1){
output = “Number is odd”;
} else {
output = “Number is even”;
}

类似问题:

Why is it considered a bad practice to omit curly braces?

【问题讨论】:

    标签: c#


    【解决方案1】:

    对于这种情况,还有条件运算符:

    output = (val % 2 == 1) ? "Number is odd" : "Number is even";
    

    如果您肯定要使用“如果”,我会使用版本 2 或版本 4,具体取决于您的其他支撑样式。 (在工作中我使用 4;对于个人项目,我使用 2。)主要是即使在单个语句周围也有大括号。

    顺便说一句,为了测试奇偶校验,使用起来稍微快一些:

    if ((val & 1) == 1)
    

    【讨论】:

    • 补充一点,c# 最常遇到的“标准”是 2,但是许多 Java 或以前的 Java 商店都会继承 4。除非你有理由不这样做,否则最好使用 2给您和其他 C# 开发人员。在阅读参考资料时也会有所帮助,参考资料大多是 2.
    • +1 表示三元运算符,-1 表示不必要的大括号。
    • 我喜欢条件运算符。 +1
    • +1 表示条件运算符,-1 表示无意义的按位破解
    • @BlueRaja:毫无意义?根据我的经验,它可以提高性能。它还可以更轻松地处理带符号的值。并不是我把它作为 an 选项,而不是 only 选项。
    【解决方案2】:

    第 2 版。我总是包含方括号,因为如果您需要在条件下放置多条线,则不必担心以后再放入方括号。这样,它可以确保您的所有 if 语句都具有相同的结构,这在您扫描代码以查找某个 if 语句时会有所帮助。

    【讨论】:

    • AND 非括号可以隐藏错误
    【解决方案3】:

    我使用的是第 2 版。

    如果您没有 else,使用花括号的一个原因会变得更加清楚。

    if(SomeCondition)
    {
      DoSomething();
    }
    

    如果您随后需要添加另一行代码,则出现问题的可能性较小:

    if(SomeCondition)
    { 
      DoSomething();
      DoSomethingElse();
    }
    

    如果没有大括号,您可能会这样做:

    if(SomeCondition)
       DoSomething();
       DoSomethingElse();
    

    【讨论】:

    • 人们一直以此作为总是使用大括号的理由,但是你有没有遇到过这种情况让你感到困惑?
    • 是的,它曾经给我造成了一个错误。我不记得我是否是负责将“DoSomethingElse”调用置于错误缩进的开发人员,但我确实找到并修复了它。当代码真正“看起来”正确时,花费的时间比您预期的要长。
    【解决方案4】:

    我个人更喜欢 3. 额外的花括号只会添加太多不必要的视觉噪音和空白。

    我可以看出使用 2/4 来减少错误的原因,但我个人从未遇到过错误,因为认为 if 语句中有多余的行。我确实使用 C# 和 Visual Studio,所以我的代码总是保持很好的格式。但是,如果我是一个更像记事本风格的程序员,这可能是个问题。

    【讨论】:

    • 也是我的想法。 :)
    • 等到晚上 1130 点你还在办公室里喝着啤酒和咖喱之夜挠头的时候…… :D
    • +1 表示 3。如果你累到分不清 if 不带大括号和 if 带大括号的区别,那么你编码太累了,你就去写废话。
    • 你还喜欢#3吗?即使编写级联 if else 语句?
    • 当 if 里面的东西是一行代码时,我只喜欢 3。我个人不喜欢级联分支
    【解决方案5】:

    我更喜欢#2。易于阅读。

    【讨论】:

    • 缩进其他?为什么?我不这么认为。
    • 是的,那是在“初学者”编辑代码并修复它之前;-)
    【解决方案6】:

    以上都不是。

    如果我的执行块只有一行(即使它是一个巨大的 for 语句),那么我不使用大括号,但我缩进它,类似于 #3

    if (num > 3)
         print "num is greater than 3";
    else
         print "num is not greater than 3";
    

    不需要花括号的多个语句的示例:

    if (num > 3)
        for (int i = 0; i < 100)
            print i + "\n";
    else
        print "booya!";
    

    也就是说,Jon Skeet 在这个问题上的回答是最好的

    【讨论】:

    • 这太容易出错了,其他人可能开始在项目上工作并添加一行认为它在条件块中并破坏应用程序。
    • @crossbrowser,我从未见过这种情况。
    • @Crossbrowser:好吧,如果他们是白痴的话。你会让不懂语言的白痴维护你的代码吗?
    • 同意上面的人..当我只有一个陈述时,我觉得括号丑陋和不必要..另外,我从未见过人们不理解它的情况......我确实倾向于看到语法警察为此争论了很多......
    • 如果另一个负责维护您的代码的开发人员搞砸了,我不明白您怎么可能坐在那里责备原作者所做的事情完全合法而不是 WTFy
    【解决方案7】:

    保持一致比选择最好的更重要。

    这些样式有不同的优点和缺点,但没有一个比在项目甚至编译单元或函数中混合它们更糟糕的了。


    三元运算符是这个特定代码的明显选择。对于无法以其他方式表达的简单单一语句if/else,我更喜欢适当缩进的情况3:

    if (val % 2 == 1)
        output = “Number is odd”;
    else
        output = “Number is even”;
    

    我了解“始终使用大括号”背后的动机,但我个人从未被他们的遗漏所困扰(好吧,一次。使用宏。)

    从上述样式中,我会选择 (2)。 (4) 如果“正确”缩进就可以了。
    (1) 我将归因于一个年轻的开发人员,他们希望从“紧凑的代码”中成长,或者一个买不起像样显示器的人。不过,如果是本地风格,我会选择它。

    【讨论】:

      【解决方案8】:

      我使用的是第 2 版。

      【讨论】:

        【解决方案9】:

        我同意三元运算符。在我遇到的代码中没有得到充分利用,我认为它比编写 if/else 语句所需的所有额外括号和缩进更容易阅读。

        【讨论】:

          【解决方案10】:

          奇怪的是没有人提到这个:

          if ( x == 1) {
             ...
          }
          else {
             ...
          }
          

          对我来说,这是唯一正确的方法,当然:-)

          【讨论】:

            【解决方案11】:

            我自己更喜欢4,但我觉得2也绝对不错。

            【讨论】:

              【解决方案12】:

              就个人而言,我认为有两种方法是好的做法:

              对于 if-blocks,只有这种方式:

              if(...)
              {
                  // ...
              }
              else if (...)
              {
                  // ...
              }
              else
              {
                  // ...
              }
              

              这是编写 if-else-blocks 最安全、最容易理解的方式。

              对于单行符(真正的一行行可以理解的单行符),可以使用三元运算符。

              var objectInstance = condition ? foo : bar;
              
              // Or the binary operator when dealing with null values
              var objectInstance = condition ?? foo;
              

              您不应该调用对当前分配没有帮助的方法。

              我不会使用上述以外的任何其他方式。

              【讨论】:

                【解决方案13】:

                版本 #2 对我来说 - 最容易看到,最容易阅读,容易看到 if 开始和结束的位置,对于 else 也是一样,如果你想添加多个语句,你不必担心放在括号中。

                【讨论】:

                  【解决方案14】:

                  我会按以下顺序使用它们: 1) 三元运算符 2) 示例 3,但缩进正确 3)无论是2还是4,它们基本相同。我会选择我工作的一般风格。

                  我同意杰克关于省略不必要的花括号的说法。我从来没有引起或见过由于添加新代码而引起的错误,并且有人认为它们是 if 语句的一部分,但不是因为缺少花括号。如果有人这样做,我会毫不留情地嘲笑他们。

                  你必须折磨我才能让我使用数字 1。

                  【讨论】:

                  • 哦,我已经调试过很多情况下由于省略大括号而导致的问题。虽然如果这样不太可能导致您出现问题,那么在简单的情况下省略它们是正确的,但是在添加额外条件层的后续维护中会出现错误。一旦你得到嵌套的 if 并省略了大括号,那么所有的赌注都将被正确理解维护的代码。总是使用大括号是预防未来问题的最简单方法,坦率地说,不这样做是懒惰和不专业的。没有它们,你和我也许总能很好地理解逻辑:-^,但是有很多愚蠢的编码员!
                  【解决方案15】:

                  我总是使用#2。 #4 是一个非常糟糕的布局,只有那些认为方法必须是一个屏幕大小的长度并且会做任何事情来填充它而不是重构代码的人才能这样做!!!

                  【讨论】:

                    【解决方案16】:

                    我个人更喜欢版本 2。但因为它只是格式化,所以没关系。使用最适合您和您的团队成员阅读的内容!

                    【讨论】:

                      【解决方案17】:

                      我使用 #2 并稍作改动

                      if (condition1) 
                      {
                            doStuff();
                      } else 
                      {
                            doSomethingElse();
                      }
                      

                      【讨论】:

                        【解决方案18】:

                        单个简短语句:

                        if (condition) output = firstChoice;
                        else doSomethingElse();
                        

                        多个或长语句

                        if (condition) {
                           output = firstChoice;
                           ...
                        } else {
                           ...
                        }
                        

                        【讨论】:

                          【解决方案19】:

                          建议使用大括号,我已经看到没有大括号的 if else 语句有一些问题,(我不记得确切)即 if 下的语句没有执行,当我用大括号添加相同的语句时,它只能工作。 (使用 Visual Studio 和 C#4.0)。

                          【讨论】:

                            【解决方案20】:

                            示例 2 无疑是最不容易出错的方法。请查看我给similar question 的答案,原因如下:

                            What is the prefered style for single decision and action statements?

                            虽然 Visual Studio 默认使用大括号是将大括号放在换行符上(我的首选方法),但 Krzysztof Cwalina 和 Brad Abrams 的 Framework Design Guidelines 书(第一版)提出了不同的约定,例如 4,将开头放置在前面的 if 语句的末尾大括号(第 274 页)。他们还声明“避免省略大括号,即使语言允许这样做”。

                            手头没有second edition,我不能说这些约定是否改变了。

                            【讨论】:

                              猜你喜欢
                              • 2014-10-21
                              • 2019-02-21
                              • 2022-10-25
                              • 1970-01-01
                              • 2012-06-22
                              • 2011-12-15
                              • 2010-11-22
                              • 2022-07-20
                              • 1970-01-01
                              相关资源
                              最近更新 更多