作为一个主要是自学成才的程序员,我从来没有真正让任何人解释为什么应该或不应该使用某些东西。一个例子(我多年前捡到并且经常使用)是另一种控制结构语法:
x = (y == true) ? "foo" : "bar";
我个人觉得这种语法很容易理解,特别是对于简短、简洁的代码,但我没有看到它在“野外”得到很多使用,所以我想知道在更多的情况下使用它是否是不好的做法传统的 if ... else结构?
提前致谢。
作为一个自学成才的程序员,我只能给你我的意见,没有任何特殊的权威。
我发现当您将三元条件运算符 (?:) 用于没有副作用的表达式时,它是完全可以接受的。一旦您开始使用它来表示做某事与做其他事情的决定,您(在我看来)就在滥用它。
简而言之,控制结构用于构建代码流,操作符用于表达式。只要保持这种方式,代码就保持可读性。
条件运算符(有时称为三元运算符,但这在技术上并不正确,请参阅 Marc 的评论)并不是真正的“替代控制结构”,有一些重要的区别:
当然也有相似之处:
一般来说,如果您正在评估副作用的替代表达式(即做工作而不是返回值),那么使用条件运算符可能比使用 if-else 结构更容易使维护者感到困惑。
如果以下所有条件都为真,请使用条件:
您给出的示例很好地使用了三元条件。
如有疑问,请使用 if-else。谨防将条件视为另一种 if-else 并试图将不属于其中的东西塞进其中。这就是(尤其是在遗留代码中发现的)让人们完全拒绝使用条件运算符的那种东西。
您所指的语法通常称为三元条件运算符,它在语义上等于 if/else 子句,并且执行相同。
对过度使用这些结构的主要反对意见是,它可能会创建一些混乱的源代码,可能不像使用 if/else 方式那样可读。对于不了解该特定语法的人来说尤其如此。假设人们理解 if/else 更有可能 100%安全。
这被称为三元表达式。如果可以用三元运算符清晰简洁地表达意图,那么我会这样做。我通常画线并有复合表达式(超过1个与&&或||结合)
好的:
var x = (someVar > 42 ) ? ThisFunction() : ThisOtherFunction();
坏的:
var x = (someVar > 42 && anotherVariable.IsSafeForConsumption() && IsNotProcessing ) ? ThisFunction() : ThisOTherFunction();
大多数开发人员应该非常熟悉条件运算符。实际上,我会简单地使用:
x = y ? "foo" : "bar";
我觉得很容易理解。/似乎==true
(==false
IMO)对布尔值过度杀伤。更常见的“旧世界”用法是:
if(12345 == someVar) {...} // etc
这个 "const == variable" 是为了避免 "=" vs "==" 的问题,但是由于 C# 不将数字视为布尔值,因此这是一个问题非常罕见,并且更常见(在C#) 看得更清楚:
if(someVar == 12345) {...} // etc
因为如果你错过了额外的 = 它通常不会编译。
对我来说,这个问题是多程序员环境中的可读性和可维护性之一。
如果其他人必须阅读代码,或者如果您稍后要返回它,则需要使其可读。
除非您保持案例简单,否则使用三元运算符的代码很容易变得混淆和不可读。
除了在最基本的场景中使用它时,我会说避免它。如果将 2 个构造编译为完全相同的 MSIL,为什么要使用难以理解的那个?
此外,由于三级运算符本质上是一个伪装成表达式的语句,因此您可以这样:
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.