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

Cod*_*num 55 c# not-operator

我理解这是一个主观问题,所以如果需要关闭我会道歉,但我觉得它经常足以让我想知道是否一般偏好一种形式而不是另一种形式.

显然,最好的答案是"重构代码,这样你就不需要测试虚假",但有时候没有简单的方法可以这样做,而"else"分支就是继续处理.因此,当您必须具有"if not false"构造时,这是首选标准:

不是运营商

if (!value)
Run Code Online (Sandbox Code Playgroud)

或者测试是假的

if (value == false)
Run Code Online (Sandbox Code Playgroud)

KP.*_*KP. 70

if (!value)更容易/更快地遵循.主观如你所说.只要你保持一致,这就是主要的事情.

编辑

另外一点要点 - 省略true/false关键字也应该(希望)迫使编码人员使用更好的命名变量.Bool变量应始终指示含义或状态目的,例如:

if (MyWallet.IsEmpty)

没有理由与上述使用== false== true因为它是多余的.以上是人类可读的.

比解密要好得多:

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

  • 诚然,一致性是最有价值的. (5认同)
  • @KP:投票赞成.关于变量名称的重点.您的答案显示了编码风格中的一个决策如何能够轻松地影响编码风格中的其他决策,并帮助第一次看到代码的人尽快理解它. (4认同)
  • @CodexArcanum:但总是错误或始终不可读是一件坏事. (3认同)
  • 我发现在某些情况下根据你的变量名更容易阅读`== false`,我发现在变量前面也更容易错过`!`.例如,`if(!log.DeviceOn.IsValid)`vs`if(log.DeviceOn.IsValid == false)` - 我更喜欢第二个. (3认同)
  • 当我什么也没得到的时候,他添加了10个upvotes,将我的回答添加到他的回答中.没有抱怨,我认为这些是游戏规则:-) (2认同)

Cha*_*ana 29

我个人喜欢

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

因为这证实该语句value is false实际上正在评估一个布尔值true ...

然后,显然,覆盖两个posssibilites增加了更多的清晰度,

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

<grin/>

我建议,对于那些为了清晰起见而且需要无可争议的可读性的人而言

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

  • if(((value == false)== true).ToString().Length == 4)... :) (19认同)
  • 啊,你们是冗余模式的模式. (12认同)
  • 也许是偏离主题,但它应该是<grin /> ;-) (5认同)
  • Nag赢了!我们必须检查布尔值的toString的长度!显然,如果它是真的,我们将得到"真",如果它是假的,我们将得到"假".你赢了. (2认同)
  • 你错过了一个点:if((value == false)== true &&(value == false)!= FileNotFound)) (2认同)

kem*_*002 20

if (!value)
Run Code Online (Sandbox Code Playgroud)

在我看来,这一点总是更加清晰.

if (value == false)
Run Code Online (Sandbox Code Playgroud)

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

(就个人而言,如果他们将变量命名为变量value而不是更有意义的东西,我也会对这个人感到恼火.我感觉你发布的只是伪代码,我肯定会在评论中这样做.)

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

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

  • +1对于理解的评论.我同意对代码概念理解较少的开发人员倾向于使用`== false`而不是允许布尔值代表自己,特别是当我看到`if(value == true)`时. (6认同)
  • -1.对不起,但这很有意思.编码风格的这种变化是没有意义的,特别是当你将它们与你可以从别人的代码中学到的许多其他东西进行比较时. (4认同)

Bil*_*ard 13

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

  • `if(value!= false)`...很好! (9认同)
  • 怎么样`if(value!= false || value == true)`?? 大声笑j/K. (4认同)
  • @KP,你的方法在添加FileNotFound的第三个布尔值时是万无一失的. (3认同)

Cla*_*edi 13

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

  • isWhatever
  • hasWhatever
  • 等等

就像是

if (Page.IsPostback == true)
Run Code Online (Sandbox Code Playgroud)

对我来说似乎多余

  • +1.例如,`while(!done)`读取为"while not done",这比`while(done == false)`更清晰,而while(读取= = false)则依次读作"while done equal false".传统的编码风格有自己的语言. (4认同)

Rob*_*cus 11

反对意见(种类)

从编译的角度来看,您将获得相同的IL,因此从可读性的角度来看,它才真正重要.

从这个角度来看,if(value == false)对于一个随意的读者来说更为明显,并且错过这个机会的可能性更小!布尔之前.

老实说,我使用这两种方法,而且大多数时候,我依赖于我的变量名称.如果仍然可以说"不"代替"爆炸",我可能会使用爆炸符号

例如

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

//but

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


Rob*_*sor 6

Not value在VB编码时使用,但value == false在C#编码时往往使用.我发现感叹号有时可能会丢失感叹号(例如!legal).也许是因为我是,呃,经验丰富的老兵.

  • 我有这么多的调料,它开始使我的头发看起来灰白,并陷入皱纹. (2认同)