Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在使用';如果(变量==true)';在if语句中,与';如果(变量)';?_C#_.net - Fatal编程技术网

C# 正在使用';如果(变量==true)';在if语句中,与';如果(变量)';?

C# 正在使用';如果(变量==true)';在if语句中,与';如果(变量)';?,c#,.net,C#,.net,因此,我最近在网上查看了一些代码,发现有人同时使用以下两种语句,这让我好奇它们之间是否有区别 if (true == true) { ... } - 我假设第一条语句会检查true等于true这一事实是否为true(如果我有点混淆,请原谅),第二条语句只是检查true是否等于true。这里唯一的不同是true==true的计算结果为true。同样,如果您将false==false放入,则其计算结果为true。只要把true放进去就行了,它不需要计算,只需要true 通常你会看到人们把if

因此,我最近在网上查看了一些代码,发现有人同时使用以下两种语句,这让我好奇它们之间是否有区别

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


我假设第一条语句会检查true等于true这一事实是否为true(如果我有点混淆,请原谅),第二条语句只是检查true是否等于true。

这里唯一的不同是
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
[edit]出于某种原因,当我第一次发布这篇文章时,我认为我在问题上看到了一个javascript标记,因此答案是针对该语言编写的。我不说了,因为javascript的答案不是你所期望的;这仍然值得一读

在.Net世界中,两者之间通常没有功能上的区别。然而,考虑到VB能够进行隐式运行时转换,我并不惊讶地发现可以创建一个人为的示例,其中转换在一种情况下与另一种情况下不符合预期,特别是基于常量表达式是比较的第一项还是第二项(这给了您一个在VB中始终使用
选项Strict
的好理由)


假设您的意思是,每个示例中的一个
true
代表一个更大的表达式,即:

if (expr == true) vs if (expr)
根据javascript的不同,可能会有所不同。请特别注意第5项和第6项:

  • 如果类型(x)是布尔值,则返回比较结果tonNumber(x)==y
  • 如果类型(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)
    调用

    为了用一个人为的例子进行说明,假设我们有以下类:

    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
    。由于
    Nullable
    没有定义
    true
    运算符,
    if(o)
    不编译。但由于
    Nullable.Equals(对象)
    is,
    o==true
    本身为true,如果(且仅当)
    o
    有值且
    o.value
    为true


    对于布尔变量,
    true
    运算符只返回其值。因此,
    if(o)
    if(o==true)之间没有实际区别
    if
    o
    是一个
    bool

    这取决于语言和对象是否可以被计算。与您希望匹配的值进行显式比较会提供更多的控制。
    if(object)
    如果对象存在并且有任何值,则可以简单地返回true,其中
    if(object==true)
    表示仅当
    object
    等于
    true
    时,您才想输入该条件。如果您知道该对象始终是布尔值,或者您同意使用值计算对象是否存在,则
    if(object){}
    ,对您来说会很好。有些人这样做是为了可读性。有时为了善待我后面的人,我会明确地做一些事情,使他不必寻找声明。当我不想善待他人时,我会嵌套函数调用。这里唯一的不同是
    true==true
    的计算结果为
    true。同样,如果你把
    false==false
    计算为
    true
    。只要把
    true
    计算为true就不需要了,它就是
    true
    。如果(true==true)
    ,谁来写
    呢?我从未在任何C代码中看到过这一点……无论如何,如果您使用Resharper,它会在您执行
    true==true
    时向您发出警告。但是生成的IL没有差异。或者您真的想问“if(booleansflag)
    if(booleansflag==true)
    之间有什么区别?”
    Foo f = new Foo();
    if (f) Console.WriteLine("A");
    if (f == true) Console.WriteLine("B");