使用true和false作为条件运算中的表达式

我正在维护一些代码,并且发现了以下模式:

var isMale = (row["Gender"].ToString() == "M") ? true : false; 

而不是这个:

 var isMale = (row["Gender"].ToString() == "M"); 

是否有人会这样做? 有人认为前者更具可读性或更清晰吗? 是否有某种旧的C“陷阱”,这是一个保留吗?

一个正当的理由? 没有。

它通常由那些并不真正理解条件本身也是表达式的人产生,产生一个布尔结果。 特别是,人们接受过不是这种情况的语言,例如BASIC的许多变体。

我想如果你得到有效的角色的报酬。 除此之外,我想不出任何理由。

如果您不能信任:( (row["Gender"].ToString() == "M")正确地产生true或false,那么您可能无法真正信任:( (row["Gender"].ToString() == "M") ? true : false; (row["Gender"].ToString() == "M") ? true : false; 无论是。 当然,你无疑需要至少重复几次:

 (row["Gender"].ToString() == "M") ? true : false ? true : false ? true : false; 

然后,也许你不能相信==?:的组合?:或者自己 – 要确定,你可能至少需要更多的冗余:

 if ((row["Gender"].ToString() == "M") ? true : false ? true : false ? true : false == true) isMale = true == true; else isMale = false != false; 

嗯……也许我昨晚熬夜了…… 🙂

我认为这完全是多余的。

根据我的经验,这通常发生在条件语句随时间演变并以明确的真或假而不是子语句结束时。

我想有些人不习惯将任何其他truefalse东西分配给布尔变量。 不知道为什么会这样,但我已经观察了很多次。

因此,从这方面来看,它看起来像:

设置讽刺

 bool isMale = (row["Gender"].ToString() == "M"); //BAAAAD 

 bool isMale = (row["Gender"].ToString() == "M") ? true : false; //BETTER 

 bool isMale; if (row["Gender"].ToString() == "M") isMale = true; else isMale = false; // BEST! 

设置讽刺

幸运的是,Resharper对所有这些反模式做了简短的工作。

 if (somebool) return true; else return false; 

“模式”在我曾经工作过的任何地方都被嘲笑。 在我看来没理由这样做。

应用三元运算符?:对于只能求值为真/假( x==y )的表达式才是完全冗余的(它只是完全冗余[它是多余的])。

对于那些不太懂英语的人来说,上面的句子可能更容易阅读,因为他们会知道在字典中首先要查找什么,如果说的话,由于重复。 然而对于母语为英语的人来说,这句话很尴尬,而且很冗余。

在您的示例中,要么运算符用于文档目的,要么没有意义冒犯,我怀疑对运算符和表达式如何工作的理解不足。

无论是缺乏理解还是一些奇怪的文档尝试,我们都可以做到这一点,而不需要像这样的冗余运算符:

 var isMale = (row["Gender"].ToString() == "M"); // bool 

要么…

 var isMale = (row["Gender"].ToString() == "M"); // true/false 

…或者更好的是,明确指定’isMale’的适当类型,而不是依赖于隐式类型:

 bool isMale = (row["Gender"].ToString() == "M"); 

我也看到人们以这种方式使用他们的代码(或使用if / else):

 bool something = some_int ? true: false; 

没有必要这样做,虽然编译器可能会对此进行优化,但依赖于分支机制本身就不那么简单了:

 bool something = some_int != 0; 

…具有相同的效果但没有使用条件分支的迂回过程。

这种代码只是令人尴尬。 这就像看到:

 switch (x) { case 1: y = 1; break; case 2: y = 2; break; case 3: y = 3; break; // etc. for all possible values of x } 

上面肯定会被大多数人认为是uber-n00b代码,但它在逻辑上不比x == y ? true: false更冗余x == y ? true: false x == y ? true: false还是x ? true: false x ? true: false (与x != 0相对)。

绝对多余。 可能是原始开发人员保留的另一种编程语言/环境的剩余实践。 我还可能会看到开发人员查看第一行更具可读性,因为他/她可以快速看到它在浏览代码时设置了一个布尔值。

第二种方式确保最有意义,我认为它更容易阅读。

第二种方式更聪明一点。 我不会过去做我做的事情,就像你在周五下午制作代码一样,我的大脑已经在周末消失了:-)