代码之家  ›  专栏  ›  技术社区  ›  Chris

我应该避免使用其他控件语法吗?

  •  1
  • Chris  · 技术社区  · 17 年前

    x = (y == true) ? "foo" : "bar";
    

    我个人觉得这种语法很容易理解,特别是对于简短、简洁的代码,但我不认为它在“野外”中有太多的用途,所以我想知道在更传统的情况下使用这种语法是否不好 如果其他的 结构

    提前谢谢。

    8 回复  |  直到 17 年前
        1
  •  13
  •   Vojislav Stojkovic    17 年前

    作为一个自学成才的程序员,我只能给你我的意见,没有任何特别的权威支持。

    我发现三元条件运算符(?:)对于没有副作用的表达式是完全可以接受的。一旦你开始用它来表示做某事与做其他事情的决定,你(在我看来)就是在滥用它。

    简而言之,控件构造用于构造代码流,运算符用于表达式。只要保持这种方式,代码就保持可读性。

        2
  •  2
  •   Adam Bellaire    17 年前

    条件运算符(有时称为三元运算符,但这在技术上并不正确,请参见Marc的评论)并不是真正的“替代控制结构”,有几个重要区别:

    • 操作人员 并提供一个值,用于表达式中。
    • 如果/else是一个控件结构,它(当然)本身不返回任何值。
    • 条件运算符中的替代项也必须是表达式。
    • if-else结构中的可选语句可以是任意数量的语句。

    • 只有适当的备选方案(表达式或块)根据条件的布尔值进行计算。
    • 两者都可以与其他同类语句链接在一起,形成更长的“开关式”语句。

    一般来说,如果您正在评估替代表达式的副作用(即做功而不是返回值),那么使用条件运算符可能比使用if-else结构更容易让维护人员感到困惑。

    如果以下所有条件均为真,请使用条件表达式:

    • 您的条件语句和替代语句很容易理解。
    • 这些表达都没有任何副作用。

    您给出的示例很好地使用了三元条件。

        3
  •  1
  •   JaredPar    17 年前

    这被称为三元表达式。如果使用三元运算符可以清楚、简洁地表达意图,那么我就这样做了。我通常用复合表达式(多于1个加上&&或| |)来表示

    好:

    var x = (someVar > 42 ) ? ThisFunction() : ThisOtherFunction();
    

    坏的:

    var x = (someVar > 42 && anotherVariable.IsSafeForConsumption() && IsNotProcessing ) ? ThisFunction() : ThisOTherFunction();
    
        4
  •  1
  •   Markus Olsson    17 年前

    the ternary conditional operator 它在语义上等同于if/else子句,并且执行相同的操作。

    过度使用theese结构的主要反对意见是,它可能会创建一些混乱的源代码,这些代码可能不像使用if/else方法那样可读。对于那些不了解特定语法的人来说尤其如此。它是 100%安全地假设人们理解if/else。

        5
  •  0
  •   Marc Gravell    17 年前

    大多数开发人员应该非常熟悉条件运算符。实际上,我会简单地使用:

    x = y ? "foo" : "bar";
    

    ==true / ==false

    if(12345 == someVar) {...} // etc
    

    这个“const==variable”是为了避免“=”vs“==”的问题,但由于C#不将数字视为布尔值,因此这是一个非常罕见的问题,更常见的是(在C#中)更清楚地看到:

    if(someVar == 12345) {...} // etc
    

    因为如果你错过了额外的=它通常不会编译。

        6
  •  0
  •   mozboz    17 年前

    对我来说,这个问题是多程序员环境中的可读性和可维护性问题。

    除非保持简单,否则使用三元运算符的代码很容易变得模糊和不可读。

    • 保持简单
    • 如果它变得甚至有点难以阅读,则重构为If{}else{}
        7
  •  0
  •   Tundey    17 年前

    除了在最基本的场景中使用,我会说避免它。如果两个构造被编译成相同的MSIL,为什么要使用难以理解的一个呢?

        8
  •  0
  •   Community Mohan Dere    9 年前

    此外,由于第三运算符本质上是 statement 伪装成一个表达式,你可以这样做:

    x = (y == true) ? "foo" : "bar";
    string instructions = "Please can somebody go and get me a " + x;
    

    string instructions = "Please can somebody go and get me a " + 
                          ((y == true) ? "foo" : "bar");
    

    这是一个非常有用的功能,我一直在使用它。正如其他人所提到的那样,要谨慎,不要编写有副作用的表达式,或者编写会降低可读性的过于复杂的表达式。

    请看在上帝的份上,不要写这样的代码(我见过很多次):

    if (y == true) {
       weWantAFoo = true;
    }
    else {
       weWantAFoo = false;
    }
    

    相反,您应该这样做:

    bool weWantAFoo = (y==true);
    

    if 陈述

    推荐文章