检查布尔值是否为真?

27
bool foo = true;

// Do this?
if (foo)
{
}

// Or this?
if (foo == true)
{
}

我喜欢其中一个,我的同事喜欢另一个。结果是一样的,但哪一个(更)正确?


这是一个风格问题。我怀疑你不会得到一个明确的答案。 - Robaticus
我希望我能投票将其关闭为一般重复问题。这个问题有太多了,而且它们都同样主观。 - BoltClock
17
Jon Skeet喜欢第一个选项,因此它是正确的方法......讨论结束!;-) - A. Levy
不需要给出明确的答案,只是希望可以讨论一下 :) - Peter Hedberg
7个回答

66

我看过的几乎所有人都倾向于一个观点

if (foo)
{
}

事实上,我看到过很多人批评显示比较(explicit comparison),甚至在此之前我自己也可能这样做过。我认为,“简短”风格是习惯用语。

编辑:

请注意,这并不意味着这行代码总是不正确的。考虑以下情况:

bool? maybeFoo = GetSomeNullableBooleanValue();
if (maybeFoo == true)
{
    ...
}

即使不加 "== true",这段代码也能编译通过,但是因为从 bool?bool 没有隐式转换,所以无法正确运行。


4
同意。我只有在foo变量名不明显是布尔类型时才会使用冗长的写法 (foo == true),这样做只是为了可读性。 - Andy May
3
对于“bool?”的评论点赞。我一直在使用(maybeFoo.HasValue && maybeFoo.Value),但是maybeFoo == true更加简洁明了。 - fredw
3
另一个选择是添加"默认"值:if (maybeFoo ?? false)if (maybeFoo ?? true)。但一般我更喜欢使用== - Jon Skeet
现在你可以这样写:if (maybeFoo === true) - undefined

27

这取决于你的情况。

我认为,如果你的布尔变量有一个好名字,那么:

if (control.IsEnabled)  // Read "If control is enabled."
{
}

如果变量名不太明显,那么检查其是否为 true 会有助于理解逻辑,但最好还是使用更清晰的变量名。

if (first == true)  // Read "If first is true."
{
}

12
+1 可读性应该指导答案 - 理想情况下,您应该重命名变量,以便您可以使用前者。 - D'Arcy Rittich
28
如果名称不明显,也许应该改名... - Rowland Shaw
在处理嵌入式系统时,通常需要检查单个位的状态。在C#中,将该位存储为布尔值是完全合理的。在这种情况下,检查布尔值是否为真可以提供比重命名变量更好的可读性。例如,考虑一个指示数据应该是输入还是输出的位。您可以将变量命名为“IsOutputBit”,但是将其命名为“IODirection”可能更易读。我承认,为此目的创建2个值的枚举甚至可能更好。 - Nicholas Miller

23

如果您打算选择

if(foo == true)

为什么不一路走到黑呢?

if(foo == true == true == true == true == true == true == true == true == true)

这是同一件事情。

我不同意如果明确命名(例如:IsSomething)那么可以不与true进行比较,但如果没有明确的命名就应该进行比较。如果它在if语句中显然可以与true进行比较。

if(monday)

与...一样具有描述性

if(monday == true)

我也喜欢不使用同样的标准:

if(!monday)

与...相对

if(monday == false)

4
我认为第一个例子几乎总是取胜的:
if(foo)
{
}

更短,更简洁。如果完全不需要添加额外的检查,为什么要添加呢?这只会浪费计算资源...

尽管如此,我确实同意有时更冗长的语法可以使事情更易读(只要性能可接受),特别是在变量命名不好的情况下。


2

两种都是正确的。

你的公司可能有一些编码标准 - 确保遵循它。如果没有 - 你应该制定一个 :)


4
规范如此的编码标准是一种“组织气味”。 - Steve Townsend
3
这种微观管理水平的编码规范让我感到烦恼。 - D'Arcy Rittich
2
@Steve Townsend:另一方面,一个文件中有十种不同的编码风格是一种“(无)组织上的臭味”,很难阅读。 - Piskvor left the building

1

没有哪一个是“更正确”的。我个人更喜欢更简洁的形式,但两者都可以。对我来说,生命太短暂了,甚至不值得为这样的事情争论。


0

个人而言,我更喜欢

if(true == foo)
{
}

没有==/=错别字的机会,我发现在foo的类型方面更具表现力。 但这是一个非常主观的问题。


3
但这是 C#,if (foo = true) 会产生编译时错误。 - ChrisF
3
@ChrisF:不会的。 "foo = true" 的结果仍然是布尔值,因此if条件语句可以正常工作。但是,在微软编译器中会生成一个警告。 - Jon Skeet
1
为什么要停在这里,当你可以做“if (true == (true == (true == foo)))”?这样不是更有表现力吗? ;) - Henrik
2
@MrDosu:如果其他语言的习惯在你的新语言中没有任何真正的理由,我强烈支持放弃它们。 - Jon Skeet
1
@MrDosu:可交换性并不代表可读性,而可读性对我来说非常重要。 - Jon Skeet
显示剩余8条评论

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