0

我环顾四周,没有找到等效的问题。
这是不好的编码习惯吗?我可以很容易地阅读它,但是对于阅读代码的人来说它是否太神秘了?

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

编辑:我为一些可怕的代码向大家道歉!这是一个工作示例。
我对回复的速度有点不知所措。我打算删除它并正确处理,但已经有 4 个回复!

4

5 回答 5

10

我会添加括号,以便澄清发生了什么 - 即。

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

有了这个,我就好了。没有它,我不得不研究一下它以弄清楚发生了什么(如果它甚至可以编译——我不知道我脑海中的操作顺序?:与??)

于 2009-06-15T06:36:45.880 回答
2

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

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

除了错别字之外,您发布它时没有轻易发现存在问题的事实(您试图bool在 ?? 的 RHS 上使用 a,当 LHS 为 时int?)表明即使您做对了也不是一个好主意.

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

总的来说,我喜欢 null 合并运算符,但我认为将它与条件运算符结合起来只会让它有点模糊。我想我可能会接受它作为一个单一的表达式有显着好处的情况下(例如对于初始化,其中替代方法是引入一个额外的方法),但总的来说我更喜欢将它分成两个语句。

编辑:在这种特殊情况下,一种替代方法是仅与“true”进行比较 - 这看起来是多余的,但不是bool?

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

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

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

result = (testBool == false) ? "No" : "Yes";
于 2009-06-15T06:34:54.187 回答
2

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

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

或者:

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

You can use the GetValueOrDefault method of the nullable type instead of the ?? operator to make it more readable:

bool? testbool = null;
string result = (testbool.GetValueOrDefault(false) ? "Yes" : "No");
于 2009-06-15T06:46:42.097 回答
1

把它包起来,我认为它很好。

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

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

(编辑:乔纳森击败了我。)

于 2009-06-15T06:37:44.990 回答
0

难道不应该

bool? testbool = null;

?

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

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

我不知道您的示例是否不完整,但我认为将变量初始化为默认值比使用可空值然后 ?? 运算符在声明后设置值。

于 2009-06-15T06:38:02.167 回答