所以我最近一直在网上搜索一些代码,并且发现人们使用以下两种语句,这使我对他们之间是否存在差异感到好奇。
if (true == true) {
...
}
-
if (true) {
...
}
我假设在第一个语句中发生的是检查true等于true的事实是否为真(对不起,如果我有点混乱)并且第二个语句只是检查是否为true等于true
答案 0 :(得分:3)
唯一不同的是,true == true
被评估为true
。同样,如果您将false == false
评估为true
。仅仅true
不需要评估它,它只是true
。
通常,您会看到有人if (flag == true)
放置if (flag)
。冗长的方法通常用于明确显示正在发生的事情 - 它可能会读得更清楚一些。我认为在做相反的事情时它会更好 - 即if (!flag)
与if (flag == false)
。
我觉得你在网上看到的代码刚刚从if (flag)
到if (flag == true)
到if (true == true)
采取了多余的额外步骤,当他们知道无论出于何种原因时, flag
总是true
。
答案 1 :(得分:2)
是的,有区别。 if (o == true)
执行相等比较; if (o)
调用true
operator。
用一个人为的例子来说明,假设我们有以下类:
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)
为defined,如果(且仅当)o == true
具有值并且o
为真,则o.Value
本身就是真的。
对于布尔变量,true
运算符只返回其值。因此,如果if (o)
是if (o == true)
,则o
和bool
之间没有实际差异。
答案 2 :(得分:1)
[edit] 出于某种原因,当我第一次发布此问题时,我认为我在问题上看到了一个javascript标记,因此答案是针对该语言编写的。我会把它留下来,因为javascript的答案不是你所期望的;它仍然值得一读。
在.Net世界中,两者之间通常没有功能差异。但是,鉴于VB能够进行隐式运行时转换,我不会感到惊讶,因为我们可以创建一个人为的例子,其中转换不会在一种情况下与另一种情况相反,特别是基于常量表达式是否为比较的第一项或第二项(这只是给你一个在VB中总是使用Option Strict
的好理由)。
假设你的意思是每个样本中有一个true
是一个更大表达的替身,即:
if (expr == true) vs if (expr)
可能存在差异,基于javascript的rules of Type Coercion for abstract equality comparison。具体来说,注意事项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
}