条件陈述的区别
以下两个陈述之间是否有任何区别?
if (null != obj)
和
if (obj != null)
如果两者处理相同哪个更好?
这里的区别是生成的代码。 这两个代码不会产生完全相同的代码,但实际上这与两个语句的结果或性能无关。
但是,如果你创建自己的类型,并覆盖不等式运算符,并做一个糟糕的工作,那么它将很重要。
考虑一下:
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)
第一个是尤达条件。 你不应该使用它。
不,但第二种方式更常见,更具可读性(在我看来更符合逻辑)
不,那里没有。 它完全一样。
样式null == obj
有时仅用于防止常见的错误obj = null
不会意外地将null赋给变量,但是使用!=
绝对没有理由这样做。
在.NET中,它实际上不会为拼写错误obj = null
编译。
因此编译器会阻止您意外地执行此操作。
Yoda条件最初来自其他语言,缺少此编译器function。
它们完全一样。
有些人更喜欢将null作为表达式的第一部分,以避免像这样的错误
if (obj = null) // should be obj == null
但是当然这不适用于!=
运算符,因此在您的示例中,它只是样式的差异。
使用第一种forms
if (blah == obj)
源于编译器无法捕获if (obj = blah)
即无意分配的日子,除非编译警告级别设置为最大值
第一种语句来自C / C ++ ,其中可以不将布尔值传递给条件validation。 例如,任何不是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
因此,使用了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 ++,您不再需要使用它了。