当前位置:  开发笔记 > 编程语言 > 正文

为什么在C#中经常会看到"null!= variable"而不是"variable!= null"?

如何解决《为什么在C#中经常会看到"null!=variable"而不是"variable!=null"?》经验,为你挑选了4个好方法。

在c#中,您说明条件的顺序的执行速度是否有任何差异?

if (null != variable) ...
if (variable != null) ...

从最近开始,我经常看到第一个,因为我习惯了第二个,所以引起了我的注意.

如果没有差异,第一个的优势是什么?



1> Jon Skeet..:

它是来自C的保留.在C中,如果你使用了一个糟糕的编译器或没有足够高的警告,这将编译时没有任何警告(并且确实是合法的代码):

// Probably wrong
if (x = 5)

当你真的可能意味着

if (x == 5)

您可以通过以下方式在C中解决此问题:

if (5 == x)

这里的拼写错误会导致代码无效.

现在,在C#中,这都是piffle.除非你比较两个布尔值(很少见,IME),否则你可以编写更易读的代码,因为"if"语句需要一个布尔表达式来开始,而" x=5" 的类型Int32不是Boolean.

我建议如果你在同事的代码中看到这一点,你就会用现代语言教育他们,并建议他们将来写出更自然的形式.


添加大括号*是合理的,IMO - C#当然不会试图阻止它成为一个问题.这与"常量==变量"问题非常不同.
我的同事们都对此表示不满,并且想要在if之后的单个语句中使用花括号(如果你稍后添加某些内容'没有意识到').如果您的语言在没有缩进的情况下是不可读的,请使用F#和Boo(以及YAML),将其作为语言的一部分,我说.
a if(this!= that){performAsSuch(); 实际上很健康."后来添加"的论点对我而言就像(a = 5)错别字一样脆弱而不是避免/发现
@jpinto:我不确定你在这里要说的是什么 - 你*做*就像单个陈述的括号,或者你不做?这个问题与变量业务之间的区别在于,在C#中,带有拼写错误的代码是*无效*代码,因此编译器将停止它.如果没有括号,那同样的*不是真的.
@Benjol不要忘记总是提供一个空的`else {}`子句,以防有人需要稍后添加一些东西并忘记自己编写`else`关键字.(玩笑)

2> DanW..:

有一个很好的理由首先使用null: if(null == myDuck)

如果class Duck覆盖==运算符,则if(myDuck == null)可以进入无限循环.

使用null首先使用默认的相等比较器和实际上做你打算什么.

(我听说你习惯于阅读那种最终编写的代码 - 我还没有经历过那种转变).

这是一个例子:

public class myDuck
{
    public int quacks;
    static override bool operator ==(myDuck a, myDuck b)
    {
        // these will overflow the stack - because the a==null reenters this function from the top again
        if (a == null && b == null)
            return true;
        if (a == null || b == null)
            return false;

        // these wont loop
        if (null == a && null == b)
            return true;
        if (null == a || null == b)
            return false;
        return a.quacks == b.quacks; // this goes to the integer comparison
    }
}


这是错的.Downvoted.只需将鼠标指向`==`运算符并将其放在那里,您将看到在两种情况下都使用了用户定义的重载.当然,如果在`b`之前检查`a`然后将'a`的位置从右操作数交换到左操作数,它可以产生细微的差别.但你也可以在`a`之前检查`b`,然后`b == null`将是逆转顺序的那个.让操作员自己调用会让人感到困惑.相反,将操作数(或两者)强制转换为`object`以获得所需的重载.比如`if((object)a == null)`或`if(a ==(object)null)`.

3> Oliver..:

就像每个人都已经注意到它会或多或少地来自C语言,如果你不小心忘记了第二个等号,你可能会得到错误的代码.但是还有另一个原因也与C#相匹配:可读性.

举个简单的例子:

if(someVariableThatShouldBeChecked != null
   && anotherOne != null
   && justAnotherCheckThatIsNeededForTestingNullity != null
   && allTheseChecksAreReallyBoring != null
   && thereSeemsToBeADesignFlawIfSoManyChecksAreNeeded != null)
{
    // ToDo: Everything is checked, do something...
}

如果您只是将所有单词交换到开头,您可以更容易地发现所有检查:

if(null != someVariableThatShouldBeChecked
   && null != anotherOne
   && null != justAnotherCheckThatIsNeededForTestingNullity
   && null != allTheseChecksAreReallyBoring
   && null != thereSeemsToBeADesignFlawIfSoManyChecksAreNeeded)
{
    // ToDo: Everything is checked, do something...
}

所以这个例子可能是一个不好的例子(参考编码指南),但想想你快速滚动一个完整的代码文件.通过简单地看到模式

if(null ...

你马上就会知道接下来会发生什么.

如果它是相反的方式,你总是要扫描到行的末尾以查看无效检查,只是让你绊倒一秒钟,找出那里做了什么样的检查.因此,语法突出显示可能会对您有所帮助,但是当这些关键字位于行尾而不是前端时,您总是会变慢.



4> angry person..:

我想这是一个已经切换语言的C程序员.

在C中,您可以编写以下内容:

int i = 0;
if (i = 1)
{
    ...
}

注意在那里使用单个等号,这意味着代码将1分配给变量i,然后返回1(赋值是表达式),并在if语句中使用1,它将被处理为true.换句话说,以上是一个错误.

但是在C#中,这是不可能的.两者之间确实没有区别.

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有