正在使用' if(变量== true)'在if语句中任何不同于' if(variable)&#39 ;?

时间:2016-02-04 02:15:14

标签: c# .net

所以我最近一直在网上搜索一些代码,并且发现人们使用以下两种语句,这使我对他们之间是否存在差异感到好奇。

if (true == true) {
   ...
}

-

if (true) {
   ...
}

我假设在第一个语句中发生的是检查true等于true的事实是否为真(对不起,如果我有点混乱)并且第二个语句只是检查是否为true等于true

3 个答案:

答案 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),则obool之间没有实际差异。

答案 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:

  
      
  1. 如果Type(x)是布尔值,则返回比较结果ToNumber(x)== y。
  2.   
  3. 如果Type(y)是布尔值,则返回比较结果x == ToNumber(y)。
  4.   

两个规则都表明,对于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
}