条件陈述的区别

时间:2011-02-10 13:40:09

标签: c# asp.net

以下两个陈述之间是否有任何区别

if (null != obj)

if (obj != null)

如果两者处理相同哪个更好?

7 个答案:

答案 0 :(得分:20)

首先是尤达的情况。使用它你不应该。

答案 1 :(得分:7)

这里的区别是生成的代码。这两个代码不会生成完全相同的代码,但实际上这与两个语句的结果或性能无关。

但是,如果您创建自己的类型,并覆盖不等式运算符,并且做得不好,那么它就很重要。

考虑一下:

public class TestClass
{
    ...

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

在这种情况下,如果运算符的第一个参数为null,即。 if (null != obj),然后它会以NullReferenceException崩溃。

总结一下:

  • 生成的代码不同
  • 性能和最终结果应该相同
    • 除非您在所涉及的类型中破坏了代码

现在,我认为你问的原因是你看过C中的代码,它通常有这样的代码:

if (null == obj)

请注意,我在这里切换到相等检查。原因是使用旧的C编译器编写的程序中经常出现的错误(这些天他们倾向于发现这个问题)将是切换它并忘记其中一个相同的字符,即。这样:

if (obj = null)

这会将null分配给变量而不是比较它。当时,解决这个错误的最佳方法是切换它,因为你无法为null分配任何东西,它不是变量。即。这将无法编译:

if (null = obj)

答案 2 :(得分:4)

不,但第二种方式更常见,更具可读性(在我看来更符合逻辑)

答案 3 :(得分:2)

不,没有。它完全一样。

样式null == obj有时仅用于防止常见拼写错误obj = null不会意外地将null赋给变量,但使用!=时,绝对没有理由这样做。

在.NET中,它实际上不会为拼写错误obj = null编译 因此,编译器会阻止您意外地执行此操作。

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

答案 4 :(得分:1)

它们完全一样。

有些人更喜欢将null作为表达式的第一部分,以避免像这样的错误

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

但当然这并不适用于!=运算符,因此在您的示例中,它只是样式的差异。

答案 5 :(得分:0)

使用第一种形式

if (blah == obj) 

源于编译器无法捕获if (obj = blah)即无意分配的日子,除非编译警告级别设置为最大值

答案 6 :(得分:0)

第一种语句来自 C / C ++ ,其中可以不将布尔值传递给条件验证。例如。任何不是0的东西都是真的,零是假的:

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

如果您忘记键入一个'='char:

,有时会产生问题
if (x = 5) { }   // this was true always and changed x value
if (x == 5) { }  // this was true, if x was equal to 5

因此,使用了Yoda语法,以便在错过一个'='的情况下接收编译器错误:

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 ++,您不再需要使用它了。