我知道这是一个主观的问题,如果需要关闭它,我很抱歉,但我觉得它经常出现让我想知道是否有一个普遍的偏好。
显然,最好的答案是“重构代码,使您不需要测试错误”,但有时没有简单的方法来做到这一点,“否则”分支只是继续处理。 因此,在必须使用“if not false”结构时,哪种是首选标准:
not运算符
if (!value)
或测试是否为假
if (value == false)
我知道这是一个主观的问题,如果需要关闭它,我很抱歉,但我觉得它经常出现让我想知道是否有一个普遍的偏好。
显然,最好的答案是“重构代码,使您不需要测试错误”,但有时没有简单的方法来做到这一点,“否则”分支只是继续处理。 因此,在必须使用“if not false”结构时,哪种是首选标准:
not运算符
if (!value)
或测试是否为假
if (value == false)
if (!value)
更容易/更快地理解。就像你说的那样,这很主观。只要你保持一致性,这是最重要的。
编辑
还有一个要点 - 省略true/false关键词也应该(希望能)迫使编码者使用更好命名的变量。布尔变量应始终指示意义或状态目的,例如:
if (MyWallet.IsEmpty)
与上述情况相比,没有使用== false
或== true
是多余的。上述内容立即就可以人类可读。
比不得像这样需要破解:
if (MyWallet.EmptyStatus == true)
或类似荒谬的东西。
== false
更容易,并且我也更容易忽略变量前面的 !
。例如,if(!log.DeviceOn.IsValid)
和 if(log.DeviceOn.IsValid == false)
- 我更喜欢第二个。 - CrimsonX我个人喜欢
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) ...
,
然后它就简洁、极易阅读,避免了否定运算符。
if (!value)
在我看来,这总是更清晰的。
if (value == false)
我不太想这么说,因为听起来有点刻薄,但这通常表明编写代码的人并不真正理解布尔值的用途。在 if 语句中重新验证布尔值是没有必要的,这是多余的。
(就我个人而言,如果他们将变量命名为 value 而不是更有意义的名称,我也会感到恼怒。我觉得你发布的只是伪代码,如果我审查时遇到这种情况,我一定会扣分。)
编辑(回应下面的评论):
看起来可能微不足道,但往往是更大问题的一个信号。实际上,大多数使用 var == true 等的人都不理解。这只是事实。我并不是说他们愚蠢或者不应该成为程序员,只是他们可能需要复习和学习一些东西。问题在于,当逻辑变得更加复杂时,不理解这样的概念会导致更大的问题。有些人说“这是一种风格。”那很好。但在这种情况下,真正的问题是,“用这种方式对我有什么好处?我或其他人从中得到了什么?”如果你不能坚实地回答这个问题,那么你需要问自己,“这是一个好主意吗?”
== false
代替让布尔值自我表达,特别是当我看到 if(value == true)
时。 - KP.if(!value)
更加清晰和"优美",特别是当您正确命名布尔变量时
类似这样的。
if (Page.IsPostback == true)
对我来说似乎是冗余的
while(!done)
可以翻译为“当未完成”,比 while(done == false)
更清晰易懂,“当完成等于假”有些拗口。编程中常用的风格和术语是一种独特的语言。 - Frank Farmer我从不会使用 if(value == true)
,为了保持一致性,我也不会使用 if(value != false)
。
不同意的观点(有些类似)
从编译的角度来看,你将得到相同的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.
在VB编程时,我使用Not value
,但在C#编程时倾向于使用value == false
。我发现感叹号有时会在变量名中被忽略(例如!legal)。也许这是因为我是一位经验丰富的老兵。
if(!value)
,因为根据英语语义,"true"的情况取决于所涉及变量的名称,这种方式更加合理。if(pane.IsChecked)
读作英语为"If the pane is checked"。
然而,如果(pane.IsChecked == true
),则读作英语为"If whether the pane is checked is true"。这个语句在英语中不够清晰。
我们没有用二进制编写C#代码的一个原因之一是人类可读性。如果给你选择阅读流畅的代码和不流畅的代码,选那个更易读的。我认为添加"== true
"并不能使这个例子更易读,MSDN也这样认为。
当然,这只是一个很小的例子,但正如其他答案所示,如果不将这种思维方式应用于大规模情况,会影响可读性。
如果我确定value是布尔类型,通常也会选择使用if(!value)。但很多时候value可能是字符串或数字。
在许多编程语言中,数字0会在条件语句中被评估为false(但并非所有语言都是如此)。但是,字符串“0”会被评估为true。这在JavaScript中尤其成为问题,特别是如果您从服务器接收JSON字符串,尤其是如果服务器是用PHP编写的(因为大多数PHP开发人员足够粗心,只需从数据库中获取值并调用json_encode即可,不知道数据库产生的是字符串,并且不知道他们作为布尔字段使用的所有零和一都将在另一端编码为字符串,因此在条件语句中全部被视为true)。
说了这么多,我的建议是:要明确,特别是如果您使用的是“非常动态”的语言(如JavaScript、PHP、Perl)。
很抱歉,我必须说第二个看起来很愚蠢。
如果有人喜欢的话,我可以添加一个额外的层级:
if( (value==false) == true )
:)
if (!detonated)
比if (unDetonated)
清晰得多。 - Jeffrey L Whitledgeif (!unDetonated)
,那肯定会让我在阅读时停顿一下。 - David Thornley