我看了一下,但没有找到一个同等的问题 这是不好的编码练习吗?我可以很容易地阅读它,但对于阅读代码的人来说它是否太神秘了?
bool? testBool = null;
string result;
result = (testBool ?? false ? "Yes" : "No");
编辑:对于一些可怕的代码,我向大家道歉!这是一个有效的例子。
我对回复的速度感到有些不知所措。我打算删除这个并且做得对,但已经有4个回复!
答案 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在声明后设置值。