代码之家  ›  专栏  ›  技术社区  ›  Nakul Chaudhary

在嵌套if或使用single with和时,哪一个更好地应用两个条件?

  •  15
  • Nakul Chaudhary  · 技术社区  · 17 年前

    嵌套的if或single if with和运算符,哪种方法更好?
    带和的单个if

    if (txtPackage.Text != string.Empty && txtPackage.Text == "abc")
    {
       //
    }
    

    嵌套的中频

    if (txtPackage.Text != string.Empty)
    { 
      if (txtPackage.Text == "abc")
      {
         //
      }
    }
    
    10 回复  |  直到 11 年前
        1
  •  5
  •   ZombieSheep    17 年前

    如果,事实上,txtpackage.text不是空的,而是包含“abc”以外的内容,那么您是否要在“嵌套if”示例中执行不同的操作?

    如果你没有,我会问你为什么要检查string.empty?

    你只需写:

    if (txtPackage.Text == "abc")
    {
    
    //
    
    }
    

    完成它。

    完全取决于你到底想做什么。

        2
  •  7
  •   Timothy Khouri    17 年前

    我不想插话,但看到这里的一些答案似乎是关于“我喜欢我的代码 像这样……我觉得我应该说点什么:)

    “更好”意味着代码执行更快,或者更可读/更可扩展。你 想把你的if嵌套在这样的情况下,你可能会有多个检查,所有都有一个共同的要求。

    例子:

    if (myThingy != null)
    {
        if (myThingy.Text = "Hello") ...
    
        if (myThingy.SomethingElse = 123) ...
    }
    

    编辑:还需要说,嵌套if需要比单个if更多的CPU周期(因此“较慢”)。除此之外,您的条件的顺序可以大大提高性能。

    Exapmle:

    if (somethingQuick() && somethingThatTakesASecondToCalculate()) ...
    

    当然比

    if (somethingThatTakesASecondToCalculate() && somethingQuick()) ...
    

    因为如果if的第一部分失败,那么第二部分甚至不会被执行,从而节省了时间。

        3
  •  5
  •   vicki    11 年前

    没有人提到维护该代码。哪个更容易调试?

    如果失败了:

    if (thisIsTrue && thisIsTrueToo)
        doStuff();
    

    你知道这两条语句中有一条失败了,但不是哪一条。

    如果失败了:

    if (thisIsTrue) {
      if (thisIsTrueToo)
        doStuff();
    }
    

    您的异常会告诉您行号。 我说,进行简单的维护,因为您可能不会永远在这个代码上。

        4
  •  2
  •   The Archetypal Paul    17 年前

    你真的需要定义你所说的“更好”是什么意思。

    我的风格是使用一个if和一个and if,就像在您的示例中一样,我正在为两个不同的值测试相同的东西。

    如果这两个测试在概念上不同,我可能会嵌套它们

    if (!user_option.work_offline) {
        if (no_current_connection) {
            start_connection()
        }
    }
    
        5
  •  1
  •   codeape    17 年前

    我觉得最好避免嵌套的ifs。

    有时,我甚至复制简单的测试来避免嵌套级别。

    示例(python):

    # I prefer:
    if a and b:
        foo()
    elif a and not b:
        bar()
    elif not a and b:
        foobar()
    elif not a and not b:
        baz()
    
    # Instead of:
    if a:
        if b:
            foo()
        else:
            bar()
    else:
        if b:
            foobar()
        else:
            baz()

    有时最后一部分是else子句更自然。在这些情况下,我通常断言else子句的条件。例子:

    if a and b:
        foo()
    elif a and not b:
        bar()
    elif not a and b:
        foobar()
    elif not a and not b:
        baz()
    else:
        assert not a and not b
        baz()
        6
  •  1
  •   shrads    17 年前

    这取决于你到底想实现什么。这是一个逻辑问题,而不是编程查询。如果您有一个依赖条件,即如果第一个条件为真,然后测试第二个条件;如果第二个条件为真,则执行某个操作;如果为假,则执行某个操作。在这种情况下,需要使用嵌套的if。但是你需要两个条件的状态来做一些事情,然后你可以和操作符一起去做。

        7
  •  0
  •   ZombieSheep    17 年前

    1英镑

    在最初的问题上,我个人尽可能避免嵌套的ifs,否则最终会得到很多箭头代码。

    但是,这个小规则也有例外。如果每个条件结果都有不同的行为,那么嵌套的ifs 可以 做个回答。您需要仔细考虑嵌套的影响,这样您就不会编写难以阅读(因此维护)的代码。

        8
  •  0
  •   Tommi    17 年前

    我更喜欢在需要时使用条件和/或运算符,而不是嵌套的ifs。看起来不那么凌乱,代码行也更少。

    if (thisIsTrue) {
    if (thisIsTrueToo) doStuff();
    }
    

    本质上与以下内容相同:

    if (thisIsTrue && thisIsTrueToo) doStuff();
    

    如果该值为假,则不会计算第二个条件。也适用于有条件或。

        9
  •  0
  •   dragonjujo    17 年前

    我认为这取决于你想要它如何流动,如果你只是在真的,真的(或任何其他的奇点)上执行,那么一个if语句就是你所需要的。

        10
  •  0
  •   J.T. Hurley    17 年前

    在我看来,你应该使用对你测试的内容最有意义的风格。如果两者紧密耦合,则可以在同一行上测试两者,而不会失去清晰度。当程序允许“if x==(1 or 2)”构造时特别容易。

    另一方面,如果这两个测试是脱节的,我宁愿将它们分开,以使逻辑更加明确。