我只是想知道这是否可行,因为我开始使用三元运算符来减少代码行,我很喜欢它。
if (x==y)
{
z += x;
} else if (x==z)
{
z += y;
} else {
z += 1;
}
如果只有一个if语句,我现在可以这样做:
z = x == y ? z += x : z += 1;
答案 0 :(得分:29)
就像这样:
z =
x == y ? z + x :
x == z ? z + y :
z + 1;
如果您使用z += x
作为操作数,它将最终执行z = (z += x)
。虽然它适用于这种特殊情况,但由于表达式z += x
是z
的最终值,因此在其他情况下可能不起作用。
但是,由于所有操作都有z +=
的共同点,您可以这样做:
z +=
x == y ? x :
x == z ? y :
1;
尽管小心使用。代码通常更易读和可维护,而且嵌套的条件操作不是很易读。此外,仅当您使用表达式作为条件操作的结果时才使用此选项,它不是if
语句的替代品。
答案 1 :(得分:5)
您可以使用
z += x == y ? x : x == z ? y : 1;
但说实话,这并不比以前更具可读性。您可以通过添加括号来使其更清晰:
z += x == y ? x : (x == z ? y : 1);
但一般来说,除非打高尔夫球,否则我会远离嵌套的条件操作符。
答案 2 :(得分:4)
四行代码,最易读的IMO。这里不需要三元运算符:
if (x == y || x == z)
z += y;
else
z++;
如果我不得不用三元写它,我会这样做:
z += (x == y || x == z) ? y : 1;
答案 3 :(得分:2)
你应该用这样的括号来做到这一点:
(x==y)?(z+=x):((x==z)?(z+=y):(z+=1))
答案 4 :(得分:1)
这很容易继续使用三元运算符而不是if else if条件,即使在"之后也需要继续运行:"。以下是样本。
var result = a ? x : b ? y : z;
答案 5 :(得分:0)
要将z
计算变成一行,我会做这样的事情:
public int GetZBasedOnXY(int z, int x, int y)
{
// Chose this solution, but any can go in here and work.
if (x == y || x == z)
return z + y;
else
return z + 1;
}
然后:
z = GetZBasedOnXY(z, x, y);
更具可读性,如果命名良好且方法具有单元测试覆盖率,则更好。