1

作为一个主要是自学成才的程序员,我从来没有真正让任何人解释为什么应该或不应该使用某些东西。一个例子(我多年前捡到并且经常使用)是另一种控制结构语法:

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

我个人觉得这种语法很容易理解,特别是对于简短、简洁的代码,但我没有看到它在“野外”得到很多使用,所以我想知道在更多的情况下使用它是否是不好的做法传统的 if ... else结构?

提前致谢。

4

8 回答 8

13

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

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

简而言之,控制结构用于构建代码流,操作符用于表达式。只要保持这种方式,代码就保持可读性。

于 2009-01-23T13:24:02.613 回答
2

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

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

当然也有相似之处:

  • 每个都评估一个条件表达式。
  • 仅根据条件的布尔值评估适当的替代项(表达式或块)。
  • 两者都可以与其他同类链接在一起以形成更长的“类似开关”的语句。

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

如果以下所有条件都为真,请使用条件:

  • 您的条件语句和替代语句很容易理解。
  • 这些表达式都没有任何副作用。
  • 将来您将不需要对替代品进行额外的行为(即副作用或额外的陈述)。

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

如有疑问,请使用 if-else。谨防将条件视为另一种 if-else 并试图将不属于其中的东西塞进其中。这就是(尤其是在遗留代码中发现的)让人们完全拒绝使用条件运算符的那种东西。

于 2009-01-23T13:42:44.073 回答
1

您所指的语法通常称为三元条件运算符,它在语义上等于 if/else 子句,并且执行相同。

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

于 2009-01-23T13:21:26.567 回答
1

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

好的:

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

坏的:

var x = (someVar > 42 && anotherVariable.IsSafeForConsumption() && IsNotProcessing ) ? ThisFunction() : ThisOTherFunction();
于 2009-01-23T13:23:10.900 回答
0

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

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

我觉得很容易理解。/似乎==true==falseIMO)对布尔值过度杀伤。更常见的“旧世界”用法是:

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

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

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

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

于 2009-01-23T13:23:05.220 回答
0

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

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

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

  • 把事情简单化
  • 如果它变得有点难以阅读,请重构为 if { } else { }
于 2009-01-23T14:13:00.283 回答
0

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

于 2009-01-23T14:32:40.540 回答
0

此外,由于三级运算符本质上是一个伪装成表达式的语句,因此您可以这样:

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);

This is just another example of using a conditional statement somewhere other than in an if statement.

于 2009-01-28T12:27:30.283 回答