2011-02-10 44 views
7

有以下两个语句条件语句差分

if (null != obj) 

if (obj != null) 

如果两个处理相同的,这将是最好有什么区别?

+7

它们可以是不同的,如果一个白痴推翻!=运算符。 – CodesInChaos 2011-02-10 13:43:26

回答

7

这里的区别是生成的代码。这两者不会生成完全相同的代码,但实际上这两个陈述的结果或表现没有关系。

但是,如果您创建自己的类型,并重写不等式运算符,并做一个糟糕的工作,那么它会很重要。

考虑一下:

public class TestClass 
{ 
    ... 

    public static bool operator !=(TestClass left, TestClass right) 
    { 
     return !left.Equals(right); 
    } 
} 

在这种情况下,如果第一个参数的经营者为空,即。 if (null != obj),那么它会崩溃与NullReferenceException

因此,要总结:产生

  • 的代码是不同的
  • 性能和最终结果应该是相同的
    • 除非你已在所涉及的类型断码

现在,我想你问的原因是,你见过代码C,W通常有这样的代码:

if (null == obj) 

请注意,我切换到相等检查在这里。原因在于用旧的C编译器编写的程序中的一个频繁的错误(现在他们倾向于解决这个问题)将会切换它并忘记其中一个相同的字符,即。此:

if (obj = null) 

此分配null到变量,而不是比较它的。解决这个问题的最好方法就是切换它,因为你不能指定任何东西到null,它不是一个变量。即。这将无法编译:

if (null = obj) 
2

不,没有。完全一样。

风格null == obj有时只是用来防止常见错字obj = null不意外null分配给一个变量,但!=但绝对没有理由这样做。

在.NET中,它不会实际编译输入错误obj = null
所以编译器可以防止你意外地做到这一点。

Yoda condition最初来自其他语言,缺少此编译器功能。

+0

如果你不小心使用`=`来替代`==`,编译器会发出警告。 – LukeH 2011-02-10 13:45:11

+0

是的,我只是想补充说.NET。 – 2011-02-10 13:45:53

4

不,但第二种方式更普遍,更可读(在我看来更符合逻辑)

20

第一种是Yoda条件。使用它你不应该。

1

它们完全一样。

有些人喜欢把null作为表达的第一部分,以避免类似

if (obj = null) // should be obj == null 

但是,当然,这并不适用于!=操作,所以在你的榜样,它只是一个错误风格的差异。

0

使用第一种形式

if (blah == obj) 

从天茎时,编译器不会赶上if (obj = blah)即无意转让,除非编译警告级别设置为最大

0

声明的第一类从C/C++,在那里有可能通过不布尔值状况检查来了。例如。任何不是0就是如此,零是假的:

if (5) { } // true 
if (0) { } // false 

有时它造成的问题,如果你忘了输入一个“=”字符:

if (x = 5) { } // this was true always and changed x value 
if (x == 5) { } // this was true, if x was equal to 5 

因此,使用尤达语法,收到编译器在情况下,一个 '=' 错误被错过:

if (5 = x) { } // this was generating compiler error for absent-minded programmers 
if (5 == x) { } // this was true, if x was equal to 5 

C#允许在条件只有布尔值,所以

if (x = 5) { } // this won't compile 
if (x == 5) { } // this is true, if x was equal to 5 

什么布尔类型?

if (y = true) { } 
if (y == true) { } 

嗯,这是无用的代码,因为你可以写if(y)。 结论:Yoda语法随C/C++一起消失了,您不必再使用它了。