在三元表达式中合并求值器是否不好?(C#)
我环顾了一下四周,没有找到一个相同的问题。在三元表达式中合并求值器是否不好?(C#),c#,ternary-operator,null-coalescing-operator,C#,Ternary Operator,Null Coalescing Operator,我环顾了一下四周,没有找到一个相同的问题。 这是一种糟糕的编码实践吗?我可以很容易地阅读它,但是对于阅读代码的人来说,它是否太神秘了 bool? testBool = null; string result; result = (testBool ?? false ? "Yes" : "No"); 编辑:我为一些可怕的代码向大家道歉!下面是一个工作示例。 回复的速度让我有点不知所措。我本来打算删除这个,并做它的权利,但已经有4个答复 编辑:原始问题使用了int?。现在已经修好了 这
这是一种糟糕的编码实践吗?我可以很容易地阅读它,但是对于阅读代码的人来说,它是否太神秘了
bool? testBool = null;
string result;
result = (testBool ?? false ? "Yes" : "No");
编辑:我为一些可怕的代码向大家道歉!下面是一个工作示例。回复的速度让我有点不知所措。我本来打算删除这个,并做它的权利,但已经有4个答复 编辑:原始问题使用了
int?
。现在已经修好了
这段代码甚至无法编译,所以是的,我认为它太神秘了
抛开打字错误不谈,您发布它时没有很容易发现问题(您试图在???的右侧使用bool
,而左侧是int?
)这一事实表明,即使您做对了,这也不是一个好主意
我需要看一个真实的例子,但我想我通常会使用null合并运算符将其拆分为一个语句,然后使用条件运算符将其拆分为另一个语句。另一种选择是使用与运算符相关的可空类型的行为。。。但同样,这是相当模糊的。(我刚刚不得不提醒自己这种行为到底是什么!)
一般来说,我喜欢空合并运算符,但我认为将其与条件运算符结合使用会使它有点模糊。我想,如果它是一个单独的表达式(例如,对于初始化,另一种方法是引入一个额外的方法),我可能会接受它,但一般来说,我更喜欢将它分成两个语句
编辑:在这种特殊情况下,另一种选择是只与“true”进行比较,这看起来是多余的,但在bool?
的情况下不是这样的:
result = (testBool == true) ? "Yes" : "No";
当然,括号不是必需的,但在我看来更清楚了
我认为这更简单:如果testBool
实际上是真的,那么结果只有“是”;否则就是“不”。如果您想将“默认”设置为“是”,您可以写:
result = (testBool == false) ? "No" : "Yes";
我会加上帕伦斯来澄清发生了什么
有了这个,我就没问题了。没有它,我不得不研究它一段时间来弄清楚到底发生了什么(如果它能编译的话——我不知道我脑子里的操作顺序是什么?:vs.?)把它包装起来,我觉得没问题
string result = (testbool ?? false) ? "Yes" : "No";
否则,即使有效,预期的操作顺序也不明显
(编辑:乔纳森狠狠地揍了我一顿。)难道不是吗
bool? testbool = null;
?
我发现没有必要在这里使用null。这让我三思而后行,所以我真的要把它写成
bool testbool = false;
string result;
result = testbool ? "Yes" : "No";
我不知道您的示例是否不完整,但我认为将变量初始化为默认值比使用可空值然后使用??运算符设置声明后的值。这有点神秘,如果表达式的计算结果为:
string result = (testbool ?? false) ? "Yes" : "No";
或:
您可以使用可为空类型的GetValueOrDefault
方法,而不是?
运算符,使其更具可读性:
bool? testbool = null;
string result = (testbool.GetValueOrDefault(false) ? "Yes" : "No");
我认为这段代码不会编译,因为testbool在编译更改后是整数,但我认为它不可读。在赋值的整个右手边放括号不是最好的选择。你说得很对,我试图在不实际引用生产代码的情况下发布一个示例。一旦我做了一个恰当的例子,我将删除这个问题。+1这很有帮助。原始表达式是WTF(在“代码质量的唯一真实度量——WTF/分钟”的意义上)
string result = testbool ?? (false ? "Yes" : "No");
bool? testbool = null;
string result = (testbool.GetValueOrDefault(false) ? "Yes" : "No");