58

我知道这是一个主观问题,所以如果需要关闭它我深表歉意,但我觉得它经常出现让我想知道是否普遍偏好一种形式而不是另一种形式。

显然,最好的答案是“重构代码,这样你就不需要测试虚假”,但有时没有简单的方法可以做到这一点,“else”分支只是继续处理。因此,当您必须有一个“如果不是假的”构造时,这是首选标准:

非运算符

if (!value)

或者是假的测试

if (value == false)
4

19 回答 19

74

if (!value)更容易/更快地遵循。你说的主观的。只要你是一致的,这是主要的事情。

编辑

要添加的另一点 - 省略真/假关键字也应该(希望)强制编码器使用更好的命名变量。布尔变量应始终指示含义或状态目的,例如:

if (MyWallet.IsEmpty)

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

比必须破译要好得多:

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

于 2010-06-04T19:58:46.900 回答
30

我个人喜欢

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

因为这是验证该语句value is false实际上正在评估为布尔真......

然后,显然,涵盖这两种可能性会增加更多的清晰度,

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

<grin/>

对于那些为了清楚起见而真正贪吃,并要求无可争议的可读性的人,我建议

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

但说真的,我只是想添加这个,创建适当且有意义的变量名称是这个问题的关键。您可以轻松地,在声明值的类中,添加一个计算变量,如(说“”实际上是“ LaunchMissile ”)
public bool AbortLaunch => !LaunchMissile
然后你所需要的就是
if (AbortLaunch) ...
然后它很简洁,非常易读,并且避免了否定操作员。

于 2010-06-04T20:03:22.290 回答
22
if (!value)

在我看来,这总是更清楚。

if (value == false)

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

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

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

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

于 2010-06-04T19:59:55.993 回答
13

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

于 2010-06-04T20:03:09.810 回答
13

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

  • 随便
  • 有什么
  • ETC

就像是

if (Page.IsPostback == true)

对我来说似乎是多余的

于 2010-06-04T20:03:17.903 回答
11

不同意见(种类)

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

从这个角度来看,对于if(value == false)普通读者来说,更明显,并且错过的机会更小!在布尔之前。

老实说,我使用这两种方法,而且大多数时候,我让它取决于我的变量名。如果用“not”代替“bang”听起来还不错,我可能会使用 bang 表示法

例如

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

//but

if(checkValue == false){}
//If (I've) not checkValue doesn't quite work here grammatically.
于 2010-06-04T20:09:07.983 回答
6

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

于 2010-06-04T20:07:09.233 回答
2

当我确定该值是布尔值时,我通常也更喜欢 if (!value) 。但很多时候它可以是一个字符串或一个数字。

在许多语言的条件句中,数字0会被评估为(但不是全部);但是,字符串 "0" 将评估为true。这是一个问题,特别是在 JavaScript 中,特别是如果您从服务器接收 JSON 字符串,特别是如果服务器是用 PHP 编写的(因为大多数 PHP 开发人员很粗心,只是从数据库中获取值并在它们上调用 json_encode,不知道DB 产生字符串并且不知道它们用作布尔字段的所有那些零和那些将在另一端被编码为字符串,因此在条件句中都被视为)。

吐槽一下。我的建议:要明确,特别是如果您的语言是“非常动态”的类型(即 JavaScript、PHP、Perl)。

于 2010-06-04T21:01:27.607 回答
2

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

考虑此 MSDN 文章中的一个示例:

if(pane.IsChecked)

用英语读作“如果窗格被选中”。

然而,if( pane.IsChecked == true) 用英文读作“如果窗格是否被选中为真”。这种说法在英语中远不如应有的清晰。

我们不以二进制形式编写 C# 代码的原因之一是人类可读性。如果您可以在阅读时流畅的代码和不流畅的代码之间进行选择,请选择更具可读性的代码。我不认为添加“ == true”会使这个示例更具可读性,MSDN 也不这么认为。

当然,这是一个需要担心的小例子。但正如其他一些答案所表明的那样,不将这种思维方式应用于更大规模的案例会损害可读性。

于 2010-06-04T20:31:27.303 回答
1

无论你喜欢哪一个。选择一个并坚持下去。

于 2010-06-04T20:00:23.543 回答
1

我喜欢这种if (!value)风格,至少用于评估变量或常见属性Page.IsPostback之类的。对于更复杂的东西,我倾向于用括号括起来,如下所示:

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

只是为了引起更多的注意。

总而言之,它是 Perl 风格unlessuntil关键字的参数。

于 2010-06-07T02:51:37.567 回答
1

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

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

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

:)

于 2010-06-04T20:10:08.507 回答
1

我不认为这一切都是主观的。我从未见过以更长的形式推荐它。实际上,我读过的所有书籍和编码指南以及“如何成为一名优秀的程序员”HowTos 都不鼓励它。

它属于同一类别

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

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

于 2010-06-04T20:28:07.517 回答
0

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

但是,当条件包含多个值检查时,我发现它更容易阅读value == false。不知何故,解析多个相等性检查比解析多个否定值更容易。

于 2010-06-04T20:05:20.830 回答
0

我更喜欢第二种选择,第if (value == false)一种。我很乐意在支持它的语言中使用if (~value)or ,但这只是将 waaaaay 与变量名或左大括号或 | 合并太容易了。或 || 运营商...至少在我看来。if (not value)!

另外,有两点:

  1. 我从不这样做if (value == true),而且我知道我前后不一致。尽管我认为一致性非常重要,但这种讨厌!的情况更糟。
  2. 我认为这真的是个人品味的问题,就像换行符辩论一样。我永远不会因为这种愚蠢的小事而批评队友,而且我很难理解那些会批评的人。
于 2010-06-07T15:57:46.900 回答
0

我其实有很多可能的形式。

这实际上并不是按照标准编写的,但这是我的看法:

//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)

因此我不认为 == false 是多余的。

于 2010-06-04T20:44:58.567 回答
0

我也认为==在 an 内部使用if是多余的,我有另一个建议,至少在视觉上,通过引入空格:

if ( ! created)

即使使用OpenDyslexic作为字体,左!括号旁边的非符号(也可能太近而无法一眼区分if(!created)

于 2020-04-15T12:13:34.277 回答
0

if一个块为了执行而应该评估的任何条件都必须评估为true.

因此, when valueis falseif (!value)允许if块执行的原因是因为!运算符本质上翻转了to的false值,从而使括号内的结果条件评估为块执行所需的条件。valuetruetrueif

if (value), if (!value), if (flag == value), if (value == true), if (value == false), 取决于要实现的目标,是有效代码。例如,当是可空的布尔值if (value == true)时非常有用,因为会给出语法错误,并且如果在执行块之前没有确保它不为空,则会抛出异常。valueif (value)if (value.Value == true)valueif

于 2018-08-10T21:18:53.187 回答
-1

我使用 if (value == false) !if (!value) 太小了,我有时会错过它。

于 2018-01-26T09:19:02.533 回答