Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在三元表达式中合并求值器是否不好?(C#)_C#_Ternary Operator_Null Coalescing Operator - Fatal编程技术网

在三元表达式中合并求值器是否不好?(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");