作为一个大多是自学成才的程序员,我从来没有真正解释为什么应该或不应该使用某些事情。一个例子(我多年前选择并经常使用)是另一种控制结构语法:
x = (y == true) ? "foo" : "bar";
我个人认为这种语法很容易理解,特别是对于简短,简洁的代码,但我不认为它“在野外”得到了很多使用,所以我想知道使用这个是不好的做法通过更传统的 if ... else 结构?
提前致谢。
答案 0 :(得分:13)
作为一个主要是自学成才的程序员,我只能给你我的意见,背后没有任何特别的权威。
我发现当你将它用于没有副作用的表达式时,三元条件运算符(?:)是完全可以接受的。一旦你开始使用它代表做某事的决定而不做其他事情,你(在我看来)会滥用它。
简而言之,控制结构用于构造代码流,运算符用于表达式。只要一个人保持这种方式,代码仍然可读。
答案 1 :(得分:2)
条件运算符(有时称为三元运算符,但在技术上不正确,请参阅Marc的注释)并不是真正的“替代控制结构”,存在一些重要的差异:
当然也有相似之处:
通常,如果您正在评估副作用的替代表达式(即工作而不是返回值),那么使用条件运算符可能比使用if-else结构更容易混淆维护者。
如果满足以下所有条件,请使用条件:
你给出的例子很好地利用了三元条件。
如有疑问,请使用if-else。要小心将条件视为另一种if-else并试图填补不属于它的东西。这种情况(特别是在遗留代码中找到)会让人们完全转向条件运算符。
答案 2 :(得分:1)
您所指的语法通常称为the ternary conditional operator,它在语义上等于if / else子句,它的执行方式相同。
过度使用theese构造的主要反对意见是它可能会创建一些有点混乱的源代码,这些源代码可能不像使用if / else方式那样可读。对于不了解该特定语法的人来说尤其如此。假设人们理解if / else。
,答案 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)
对我来说,这个问题是多程序员环境中的可读性和可维护性。
如果其他人必须阅读代码,或者您稍后再回来,则需要使其可读。
除非您保持案例简单,否则使用三元运算符的代码很容易变得混淆且不可读。
答案 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
语句之外的某处使用条件语句的另一个例子。