在 if 语句中使用 'if (variable == true)' 与"if(变量)"有什么不同吗?

  • 本文关键字:if 变量 true 语句 variable c# .net
  • 更新时间 :
  • 英文 :


所以我最近一直在网上查找一些代码,发现人们使用以下两种语句,这让我很好奇它们之间是否存在差异。

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项:

  1. 如果 Type(x( 是布尔值,则返回比较结果 ToNumber(x( == y。
  2. 如果 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)之间没有实际区别。

最新更新