以三元表达式合并评估者是不是很糟糕? (C#)

时间:2009-06-15 06:30:16

标签: c# ternary-operator null-coalescing-operator

我看了一下,但没有找到一个同等的问题 这是不好的编码练习吗?我可以很容易地阅读它,但对于阅读代码的人来说它是否太神秘了?

bool? testBool = null;  
string result;  
result = (testBool ?? false ? "Yes" : "No");  

编辑:对于一些可怕的代码,我向大家道歉!这是一个有效的例子。
我对回复的速度感到有些不知所措。我打算删除这个并且做得对,但已经有4个回复!

5 个答案:

答案 0 :(得分:10)

我会添加parens以澄清正在发生的事情 - 即

bool? testbool = null;
string result;
result = (testbool ?? false) ? "Yes" : "No";

有了它,我会好起来的。没有它,我不得不研究它以找出发生了什么(如果它甚至编译 - 我不知道我的头顶操作的顺序是什么?:vs. ??)

答案 1 :(得分:2)

编辑:原始问题使用了int?。现在已经修复了。

该代码甚至不会编译,所以是的,我会说它太神秘了。

抛开错别字,你发布它的事实并没有轻易地发现存在问题(你正试图在LHS的RHS上使用bool,当LHS是一个int?)表明即使你做对了也不是一个好主意。

我需要看一个真实世界的例子,但我认为我通常使用null合并运算符将其拆分为一个语句,然后使用条件运算符将其拆分为另一个语句。另一个选项是使用与运算符相关的可空类型的行为......但同样,合理地模糊。 (我只需要提醒自己确切的行为是什么!)

我一般喜欢null合并运算符,但我认为将它与条件运算符结合起来只是让它变得模糊不清。我认为我可能会接受它,因为它是一个单一表达式的重要好处(例如,对于初始化,替代方案是引入一个额外的方法),但总的来说我更喜欢将它分成两个语句。

编辑:特定情况中的一个替代方案是仅与“true”进行比较 - 这看起来多余,但不是bool?的情况:

result = (testBool == true) ? "Yes" : "No";

当然,括号不是必需的,但是要增加IMO的清晰度。

我认为这更简单:如果testBool实际上是真的,结果只是“是”;否则就是“不”。如果你想“默认”为是,你会写:

result = (testBool == false) ? "No" : "Yes";

答案 2 :(得分:2)

这有点神秘,如果表达式被评估为:

string result = (testbool ?? false) ? "Yes" : "No";

或:

string result = testbool ?? (false ? "Yes" : "No");

您可以使用可空类型的GetValueOrDefault方法而不是??运算符来使其更具可读性:

bool? testbool = null;
string result = (testbool.GetValueOrDefault(false) ? "Yes" : "No");

答案 3 :(得分:1)

包裹它,我认为没关系。

string result = (testbool ?? false) ? "Yes" : "No";

否则预期的操作顺序即使有效也不明显。

(编辑:Jonathan捏了一拳。)

答案 4 :(得分:0)

不应该是

bool? testbool = null;

我发现这里不需要使用可空的内容。这让我三思而后行,所以我真的把它编码为

bool testbool = false;
string result;
result = testbool ? "Yes" : "No";

我不知道你的例子是不完整的,但是我认为将变量初始化为默认值比使用可空的那个更安全然后?? operator在声明后设置值。