哪种形式更清晰:if(!value)还是if(flag == value)?

59

我知道这是一个主观的问题,如果需要关闭它,我很抱歉,但我觉得它经常出现让我想知道是否有一个普遍的偏好。

显然,最好的答案是“重构代码,使您不需要测试错误”,但有时没有简单的方法来做到这一点,“否则”分支只是继续处理。 因此,在必须使用“if not false”结构时,哪种是首选标准:

not运算符

if (!value)

或测试是否为假

if (value == false)

41
第一种方法的优点是,您无法执行 if (shouldLaunchMissiles = false)。 - JRL
5
由于这是一个主观性的问题,假设社区认为答案很有价值并且想要保留它,是否可以将此问题设置为维基问答?我认为,对于这个问题,给任何人"回答"的信用都不太公平,因为没有绝对正确的答案。 - CodexArcanum
3
我认为测试错误不是问题。更大的问题是布尔值表达负条件。例如,对我来说if (!detonated)if (unDetonated)清晰得多。 - Jeffrey L Whitledge
4
更糟的是,如果代码中出现if (!unDetonated),那肯定会让我在阅读时停顿一下。 - David Thornley
2
@David Thornley - 没错!这就是负面含义的布尔值不可避免地导致的结果! - Jeffrey L Whitledge
显示剩余4条评论
19个回答

75

if (!value)更容易/更快地理解。就像你说的那样,这很主观。只要你保持一致性,这是最重要的。

编辑

还有一个要点 - 省略true/false关键词也应该(希望能)迫使编码者使用更好命名的变量。布尔变量应始终指示意义或状态目的,例如:

if (MyWallet.IsEmpty)

与上述情况相比,没有使用== false== true是多余的。上述内容立即就可以人类可读。

比不得像这样需要破解:

if (MyWallet.EmptyStatus == true)或类似荒谬的东西。


5
确实,始终如一是最有价值的品质。 - CodexArcanum
3
@CodexArcanum:但是持续犯错或持续难以理解是不好的。 - David
4
@KP:点赞。对于变量名称的观点很好。你的答案展示了编码风格中一个决定如何轻易地影响其他决定,并且帮助那些第一次看到代码的人尽快理解它。 - David
2
他在我的回答后面添加了10个赞,而我却没有得到任何东西。没有抱怨,我认为这就是游戏规则 :-) - Claudio Redi
4
根据变量名不同,在某些情况下,我发现阅读 == false 更容易,并且我也更容易忽略变量前面的 !。例如,if(!log.DeviceOn.IsValid)if(log.DeviceOn.IsValid == false) - 我更喜欢第二个。 - CrimsonX
显示剩余5条评论

30

我个人喜欢

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

因为这验证了语句value is false实际上计算结果是一个布尔值true...

然后,显而易见的是,覆盖两种可能性会增加更多的清晰度,

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

<grin/>

对于那些真正想要清晰明了且要求不容置疑可读性的人,我建议

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

但说实话,我刚想到可以添加这个,创建适当和有意义的变量名称是解决这个问题的关键。在声明value的类中,很容易添加计算变量,例如(比如“value”实际上是“LaunchMissile”):
public bool AbortLaunch => !LaunchMissile,
然后你只需要
if (AbortLaunch) ...,
然后它就简洁、极易阅读,避免了否定运算符。


13
啊,又是那个多余模式的模式。 - Anthony Pegram
22
如果 (((value == false) == true).ToString().Length == 4) ... :) (说明:原文中的笑脸表情符号会在翻译过程中自动省略,因为它不能直接翻译成其他语言。) - Nagg
2
Nag 赢了!我们必须检查布尔型的 toString 的长度!显然,如果它是 true,我们将得到 "True",如果它是 false,我们将得到 "False"。你赢了。 - Warty
5
可能有点跑题,但应该是这样的<微笑/> ;-) - Axel
2
你错过了一个细节:if((value == false) == true && (value == false) != FileNotFound)) - JulianR
显示剩余4条评论

23
if (!value)

在我看来,这总是更清晰的。

if (value == false)

我不太想这么说,因为听起来有点刻薄,但这通常表明编写代码的人并不真正理解布尔值的用途。在 if 语句中重新验证布尔值是没有必要的,这是多余的。

(就我个人而言,如果他们将变量命名为 value 而不是更有意义的名称,我也会感到恼怒。我觉得你发布的只是伪代码,如果我审查时遇到这种情况,我一定会扣分。)

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

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


7
理解评论的观点,同意开发人员缺乏对代码概念的理解会倾向于使用== false代替让布尔值自我表达,特别是当我看到 if(value == true)时。 - KP.
好的,现在,如果(value == true)只是愚蠢的。在C#中,它可能在像Javascript这样的语言中具有优点,因为if(value)既测试布尔真值又进行空检查。 - CodexArcanum
如果我必须用JavaScript编写,我会写成 if(true == value) 这样,我就不会意外地给value赋值......并不是我以前做过那种事情......从来没有。 - kemiller2002
4
很抱歉,但这确实有点刻薄。在编码风格上进行如此变化是没有意义的,特别是当你将它们与从其他人的代码中学到的许多其他事物进行比较时。 - Oak
我已经从事编程工作45年以上,一直使用if (!value)的写法,直到读了《Clean Coding》这本书,作者是Bob Martin叔叔。他说服了我,if (value == false)更易于阅读。它也不容易被忽略,例如:if (!Ibingo)或if (Ibingo)。 - Darryl Wagoner WA1GON
显示剩余3条评论

13

if(!value) 更加清晰和"优美",特别是当您正确命名布尔变量时

  • isWhatever
  • hasWhatever
  • 等等

类似这样的。

if (Page.IsPostback == true)

对我来说似乎是冗余的


5
明白,我将尽力实现这个要求。以下是需要翻译的内容:+1. 例如 while(!done) 可以翻译为“当未完成”,比 while(done == false) 更清晰易懂,“当完成等于假”有些拗口。编程中常用的风格和术语是一种独特的语言。 - Frank Farmer

13

从不会使用 if(value == true),为了保持一致性,我也不会使用 if(value != false)


9
如果(value不等于false)...太棒了! - Matthew Whited
3
@KP,当他们添加第三个布尔值表示文件未找到时,你的方法是万无一失的。 - Jesse C. Slicer

12

不同意的观点(有些类似)

从编译的角度来看,你将得到相同的IL,所以这实际上只关乎可读性。

从这个角度来看,对于普通读者来说,if(value == false)更加明显,而且在布尔值前不会漏掉感叹号。

老实说,我两种方法都使用,大多数情况下,我会根据变量名来确定。如果用“not”代替“bang”仍然听起来不错,我可能会使用感叹号记号。

例如:

if(!gotValue) {}
//if (I've) not gotValue

//but

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

6

在VB编程时,我使用Not value,但在C#编程时倾向于使用value == false。我发现感叹号有时会在变量名中被忽略(例如!legal)。也许这是因为我是一位经验丰富的老兵。


2
我有太多的编程经验,它开始让我的头发变灰并卡在皱纹里。 - Robaticus
1
太遗憾了,C#没有像C++那样突出的“not”关键字。 - David R Tribble

2
我更支持使用if(!value),因为根据英语语义,"true"的情况取决于所涉及变量的名称,这种方式更加合理。
考虑在此MSDN文章中的其中一个示例:
if(pane.IsChecked)

读作英语为"If the pane is checked"。

然而,如果(pane.IsChecked == true),则读作英语为"If whether the pane is checked is true"。这个语句在英语中不够清晰。

我们没有用二进制编写C#代码的一个原因之一是人类可读性。如果给你选择阅读流畅的代码和不流畅的代码,选那个更易读的。我认为添加"== true"并不能使这个例子更易读,MSDN也这样认为。

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


2

如果我确定value是布尔类型,通常也会选择使用if(!value)。但很多时候value可能是字符串或数字。

在许多编程语言中,数字0会在条件语句中被评估为false(但并非所有语言都是如此)。但是,字符串“0”会被评估为true。这在JavaScript中尤其成为问题,特别是如果您从服务器接收JSON字符串,尤其是如果服务器是用PHP编写的(因为大多数PHP开发人员足够粗心,只需从数据库中获取值并调用json_encode即可,不知道数据库产生的是字符串,并且不知道他们作为布尔字段使用的所有零和一都将在另一端编码为字符串,因此在条件语句中全部被视为true)。

说了这么多,我的建议是:要明确,特别是如果您使用的是“非常动态”的语言(如JavaScript、PHP、Perl)。


1

很抱歉,我必须说第二个看起来很愚蠢。

如果有人喜欢的话,我可以添加一个额外的层级:

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

:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接