我应该避免使用替代控制语法吗?

时间:2009-01-23 13:17:45

标签: c# php syntax theory

作为一个大多是自学成才的程序员,我从来没有真正解释为什么应该或不应该使用某些事情。一个例子(我多年前选择并经常使用)是另一种控制结构语法:

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

我个人认为这种语法很容易理解,特别是对于简短,简洁的代码,但我不认为它“在野外”得到了很多使用,所以我想知道使用这个是不好的做法通过更传统的 if ... else 结构?

提前致谢。

8 个答案:

答案 0 :(得分:13)

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

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

简而言之,控制结构用于构造代码流,运算符用于表达式。只要一个人保持这种方式,代码仍然可读。

答案 1 :(得分:2)

条件运算符(有时称为三元运算符,但在技术上不正确,请参阅Marc的注释)并不是真正的“替代控制结构”,存在一些重要的差异:

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

当然也有相似之处:

  • 每个评估一个条件表达式。
  • 仅根据条件的布尔值计算适当的替代(表达式或块)。
  • 两者都可以与其他类似的人联系在一起,形成更长的“类似开关”的陈述。

通常,如果您正在评估副作用的替代表达式(即工作而不是返回值),那么使用条件运算符可能比使用if-else结构更容易混淆维护者。

如果满足以下所有条件,请使用条件:

  • 您的条件和替代陈述很容易理解。
  • 这些表达都没有任何副作用。
  • 将来,您不需要对备选方案采取其他行为(即副作用或其他声明)。

你给出的例子很好地利用了三元条件。

如有疑问,请使用if-else。要小心将条件视为另一种if-else并试图填补不属于它的东西。这种情况(特别是在遗留代码中找到)会让人们完全转向条件运算符。

答案 2 :(得分:1)

您所指的语法通常称为the ternary conditional operator,它在语义上等于if / else子句,它的执行方式相同。

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

更可能 100%安全

答案 3 :(得分:1)

这被称为三元表达式。如果可以用三元运算符清楚简明地表达意图,那么我就这样做了。我通常画线并有复合表达式(超过1与&&或||结合)

好:

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

为:

var x = (someVar > 42 && anotherVariable.IsSafeForConsumption() && IsNotProcessing ) ? ThisFunction() : ThisOTherFunction();

答案 4 :(得分:0)

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

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

我觉得很容易理解。 ==true / ==false似乎(IMO)过度杀戮。更常见的“旧世界”用法是:

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

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

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

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

答案 5 :(得分:0)

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

如果其他人必须阅读代码,或者您稍后再回来,则需要使其可读。

除非您保持案例简单,否则使用三元运算符的代码很容易变得混淆且不可读。

  • 保持简单
  • 如果它甚至有点难以阅读,请重构为{} else {}

答案 6 :(得分:0)

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

答案 7 :(得分:0)

此外,由于第三级运算符基本上是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语句之外的某处使用条件语句的另一个例子。