所以我最近一直在网上查找一些代码,发现人们使用以下两种语句,这让我很好奇它们之间是否存在差异。
if (true == true) {
...
}
-
if (true) {
...
}
我假设第一个语句发生的情况是,它检查 true 等于 true 的事实是否为真(对不起,如果我有点困惑(,并且第二个语句只是检查 true 是否等于 true。
这里唯一的区别是true == true
被评估为true
。同样,如果您输入false == false
,则其评估结果为true
。只是把它放在true
不需要评估,它只是true
.
通常,您会看到人们在同样可以if (flag)
时if (flag == true)
放。冗长的方法通常用于明确显示正在发生的事情 - 它可能读起来更清晰一些。我认为在做相反的事情时读起来更好 - 即 if (!flag)
与if (flag == false)
.
我感觉你在网上看到的代码只是从if (flag)
到if (flag == true)
到if (true == true)
的冗余额外步骤,当他们知道,无论出于何种原因,flag
总是true
。
[编辑] 出于某种原因,当我第一次发布这个时,我想我在这个问题上看到了一个javascript标签,所以答案是为该语言编写的。我就不说了,因为 javascript 的答案不是你所期望的;它仍然值得一读。
在 .Net 世界中,两者之间通常没有功能差异。但是,鉴于 VB 进行隐式运行时转换的能力,我不会惊讶地发现可以创建一个人为的示例,其中转换在一种情况下与另一种情况下不会执行您的预期,特别是基于常量表达式是比较的第一项还是第二项(这只会为您提供一个始终在 VB 中使用 Option Strict
的充分理由(。
假设你的意思是每个样本中的一个true
是更大表达式的替身,即:
if (expr == true) vs if (expr)
根据 JavaScript 的类型强制规则,可以存在差异,用于抽象相等比较。具体而言,注第5项和第6项:
- 如果 Type(x( 是布尔值,则返回比较结果 ToNumber(x( == y。
- 如果 Type(y( 是布尔值,则返回比较结果 x == ToNumber(y(。
这两个规则都表明,对于if (expr == true)
样式比较(反之亦然(,布尔常量首先转换为数字,然后抽象比较规则重新启动。你基本上是在将expr
与一个数字进行比较(除非expr
已经是一个布尔值(。
但是,if (expr)
样式比较将尝试将expr
直接强制使用布尔值。这里重要的是要记住,很多事情会强制使用一个true
布尔值,该值在数值上不会等同于true
的数值。
例如:
if (3 == true)
{
alert('3 == true') //this will NOT show
}
else
{
alert('3 != true') // but this will
}
if (3)
{
alert('3') // this WILL also show
}
是的,有区别。 if (o == true)
执行相等比较; if (o)
调用true
运算符。
为了用一个人为的例子来说明,假设我们有以下类:
class Foo
{
public static bool operator true(Foo f) => true;
public static bool operator false(Foo f) => true;
public static bool operator == (Foo fb, bool b) => false;
public static bool operator !=(Foo fb, bool b) => false;
}
假设我们调用:
Foo f = new Foo();
if (f) Console.WriteLine("A");
if (f == true) Console.WriteLine("B");
此段将"A"写入控制台。 语句if (f)
调用 true
运算符,该运算符返回 true,因此打印"A"。 语句if (f == true)
调用 Foo.op_Equality(Foo, bool)
,返回 false。
if (o)
和if (o == true)
不同的一个值得注意的情况是o
属于 Nullable<bool>
型。 由于Nullable<bool>
没有定义true
运算符,因此if (o)
不会编译。 但是由于Nullable<T>.Equals(object)
是定义的,当(且仅当(o
有一个值并且o.Value
为真时,o == true
本身为真。
对于布尔变量,true
运算符仅返回其值。 因此,如果o
if (o)
是bool
,和if (o == true)
之间没有实际区别。