哪个更清晰:if(!value)还是if(flag == value)?

我知道这是一个主观的问题,所以如果需要closures的话,我表示歉意,但是我觉得我经常想知道是否有一种forms比另一种更普遍。

显然,最好的答案是“重构代码,所以你不需要testing虚假”,但是有时候没有简单的方法去做,“else”分支只是继续处理。 所以当你必须有一个“如果不是假的”结构,这是首选的标准:

不是操作员

if(!value) 

或者testing为假

 if(value == false) 

if(!value)更容易/更快跟随。 主观如你所说。 只要你一致,这是主要的事情。

编辑

还有一点要补充 – 省略true / false关键字也应该(希望)强制编码器使用更好的命名variables。 布尔variables应该总是指示意义或状态目的,例如:

if(MyWallet.IsEmpty)

上面没有理由使用== false== true因为它是多余的。 以上是人类可读的立即。

比解读要好得多:

if(MyWallet.EmptyStatus == true)或者像这样荒谬的东西。

我个人喜欢

if ((value == false) == true)

因为这是validation语句value is false的实际上评估为一个布尔真正…

那么,显然,涵盖两个正确答案就更加清晰了,

if ((value == false) == true && (value == false) != false)

<grin/>

对于那些真正的贪婪的人来说,要求清晰,并要求无可辩驳的可读性,我build议

if (((value == false) == true && (value == false) != false) == true)

 if(!value) 

这在我看来总是很清楚。

 if(value == false) 

我讨厌这样说,因为这听起来有点意思,但这通常表明编写代码的人并不真正理解布尔值的使用。 您不需要重新validationif语句中的布尔值是什么。 这是多余的。

(就个人而言,如果他们给variablesvalue而不是更有意义的话,我也会对这个人感到恼火,我有一种感觉,你发布的只是伪代码,我肯定会在审查过程中)。

编辑(回复下面的评论):

它可能看起来微不足道,但往往是一个更大的事情的标志。 实际上,大多数使用var == true等的人都不明白。 这只是一个事实。 我不是说他们愚蠢,或者他们不应该是程序员,只是有可能是他们需要审查和学习的东西。 问题是,当逻辑变得复杂的时候,不理解这样的概念会导致更多的问题。 有人说“这是一种风格”。 没关系。 在这种情况下,真正的问题是:“这样做对我有什么好处?我或他人从中得到了什么? 如果你不能很好地回答这个问题,那么你需要问自己:“为什么这是个好主意?

永远不会使用if(value == true) ,所以为了一致性我也不会使用if(value != false)

if(!value)更清晰,更“优雅”,特别是如果你正确地命名布尔variables

  • isWhatever
  • hasWhatever
  • 等等

就像是

 if (Page.IsPostback == true) 

对我来说似乎多余

反对意见(种类)

从编译的angular度来看,你将得到相同的IL,所以从可读性的angular度来看,这只是一个问题。

从这个angular度来看, if(value == false)对于一个随便的读者来说更为明显,而且错过了这个机会的可能性就越小。 在布尔之前。

老实说,我使用这两种方法,而且大部分时候,我都依赖于我的variables名。 如果说“不”来代替“爆炸”还是可以的,我很可能会用爆炸符号

例如

 if(!gotValue) {} //if (I've) not gotValue //but if(checkValue == false){} //If (I've) not checkValue doesn't quite work here grammatically. 

在VB中编码时使用Not value ,但在C#中编码时倾向于使用value == false 。 我发现感叹号有时会以variables的名义丢失(例如!legal)。 也许是因为我是一个经验丰富的老手。

我不认为这是主观的。 我从来没有见过它在较长的forms推荐。 其实所有的书籍和编码指南和“如何成为一个好的程序员”我读过的HowTos阻止了它。

它属于同一类别

 if (value) { return true; } else { return false; } 

OTOH,这里给出的所有答案,使我的第一个陈述不等于不正确。

我通常会喜欢if(!value),当我知道肯定的值是一个布尔值。 但是很多时候它可以是一个string,或者一个数字。

在很多语言中,数字将在条件中被评估为 (但不是全部)。 但是,string“0”将评估为true 。 特别是在JavaScript中,尤其是如果你从服务器接收到JSONstring,特别是如果服务器是用PHP编写的(因为大多数PHP开发人员不小心只从数据库取得值并调用json_encode,数据库会产生string,并且不知道所有那些用作布尔字段的零和那些将在另一端被编码为string的线索,因此在条件中都被视为 )。

饶舌了 我的build议是:明确的,特别是如果你的语言是“非常dynamic”的types(即JavaScript,PHP,Perl)。

不pipe你喜欢什么 挑一个,坚持下去。

我会倾向于使用if(!value)因为根据所涉及variables的名称,根据英语语义,“真实”情况更有意义。

考虑一下MSDN文章中的例子之一:

 if(pane.IsChecked) 

英文为“如果窗格被选中”。

但是,如果( pane.IsChecked == true )以英文显示为“如果窗格是否被选中”。 这个说法在英文上不太清楚,应该是这样。

我们不使用二进制编写C#代码的原因之一是人的可读性。 如果你在阅读代码时能够selectstream畅的代码,而不是代码,那么select一个更具可读性的代码。 我不认为添加“ == true ”使这个例子更具可读性,MSDN也不这么认为。

当然,这是一个很小的例子。 但是,正如其他一些答案所指出的,如果不将这种思维方式应用于较大规模的案例,可能会影响可读性。

我喜欢if (!value)风格至less用于评估像Page.IsPostback等variables或常见属性。 对于任何更复杂的事情,我倾向于像下面这样将expression式括起来:

 if (!(SomeType.SomeProperty.CallingAMethod(input).GetSomething.BooleanProperty)) 

只是要多加注意一下。

总而言之, unlessuntil关键字, unless这是Perl风格的一个参数。

我更喜欢第二个选项, if (value == false)之一。 我很乐意在支持它的语言中使用if (~value)if (not value) ,但是! 只是简单地将waaaaay与variables名或开括号或|进行合并 或|| 运营商…至less在我看来。

另外,还有两件事情:

  1. 我从来没有做, if (value == true) ,我知道我不一致。 虽然一致性在我看来非常重要,但是讨厌! 更糟的是
  2. 我认为这是一个个人品味的问题,就像新一轮的辩论一样。 我永远不会批评队友这样的傻事,而且我也很难理解那些愿意的人。

如果条件只是检查一个值,那么!value更快。

但是,当条件包含多个值检查时,我发现读取value == false更容易。 不知何故,parsing多个检查的等式比多个值的否定更容易。

我很抱歉地说,第二只看起来很愚蠢。

我会添加一个额外的级别,如果有人喜欢它:

 if( (value==false) == true ) 

🙂

我其实有很多可能的forms。

这实际上并不是如何写入标准,但这是我如何看待它:

 //if foo is(or exists) if(foo) //if foo is true if(foo == true) //if foo doesn't exist if(!foo) if foo is false if(foo == false) 

因此,我不认为==错误是多余的。

Interesting Posts