可能重复:
Why does one often see “null != variable” instead of “variable != null” in C#?为什么null == myVar而不是myVar == null?
我看到它从时间到时间,我想知道这是为什么。有没有什么区别?
可能重复:
Why does one often see “null != variable” instead of “variable != null” in C#?为什么null == myVar而不是myVar == null?
我看到它从时间到时间,我想知道这是为什么。有没有什么区别?
避免myVar = null
(哎呦)的意外错字是个老习惯。它在某些语言中仍然有用,但C#会保护您免于这样做,因此在那里没有必要。
这是从C缓缴较旧的编译器不会赶上这样的:
if (foo = null)
当你的意思是这样的:
if (foo == null)
经典笑话的例子是这样的错误:
if (fireTheNukes = true)
fireTheNukes();
这通常被认为是一种古老的模式,因为任何值得它的盐的编译器都会在一个条件语句。我会在你的代码中避免这种模式,因为它现在没有任何用处。
@Andrew:我认为if(foo = null)是一个完全有效的语句(赋值给foo,然后检查它是否为真)。我认为这与编译器没有“捕捉”它有什么关系。 – 2009-09-20 23:45:08
@Esteban - 什么语言和编译器?虽然C#编译器_will_允许在条件语句中进行布尔赋值,但它也会生成一个“你真的想要这么做吗?”警告。 – 2009-09-21 00:01:29
这是一个古老的防御习惯。如果将常量放在左侧,则忘记第二个等号会导致编译错误。在更正常的格式中,忘记第二个等号会导致将null分配给变量。
换句话说,
myVar = null
是有害的,令人惊讶,而
null = myVar
得到由编译器捕获。
这是C程序员的习惯,在这种情况下,C程序员已经习惯了C#,但实际上完全没有必要。
考虑在C中,如果您不小心键入if (myVar = null)
,编译器将执行分配,而不是抱怨。围绕myVar
和null
的顺序进行切换确保如果==
无意错误输入为=
,则会生成编译器错误。但是,C#在这两种情况下都会生成编译器警告,所以这个怪癖是不必要的。
它来自C/C++赶留出一个等号:
myVar = null
但它不是在C#中需要的。
正如其他人所提到的,这是一种针对可能由于在C和一些C衍生物(包括C#)中赋值表达式评估为该赋值而产生的问题的防御性策略。这是什么让你这样做:
if (a = true) { /* This will always get done, as "a = true" evals to true */ }
和
int a = b = c = d = 10;
由于分配是对联想这是有效
int a = (b = (c = (d = 10)));
其中的一对括号内的每个表达式会值,在这种情况下,10和a,b,c和d因此将全部为10.
为了避免潜在的错误 - 混合赋值和相等运算符 - 一些程序员宁愿始终将常量放在左边,就好像赋值运算符被意外使用一样,编译器会抱怨你不能赋值常量。
但是,这在C#中不是一个问题,原因有两个。首先,与C不同,C#不允许将任意值解释为布尔值。
这在C中是必须的,因为它没有真正的布尔类型,它只依赖于像整数(其中0为假和非零为真)或指针(其中NULL为假)的其他值的解释。这意味着,你可以做类似
if (10) { /* This will always get done */ }
if (0) { /* This will never get done */ }
if (p) { /* This will get done is p is not null */ }
if (NULL) { /* This will never get done */ }
然而,因为C#不允许任意表达式被解释为一个布尔值,这些不会在C#中工作。这也意味着,
if (a = 10) { }
不会在C#编译,作为表达“A = 10”的计算结果为表达,10,其不能再被解释为所要求的布尔值的值。
问题的第二个原因是,在分配结果可以被解释为布尔值的情况下,现在小得多的百分比情况下,编译器会发出警告以确保您确实意味着要做到这一点。
警告可以
#pragma warning disable 665
然而,这样的代码的存在往往是一个糟糕的代码气味可能是最好的重构,使代码更清晰处理被抑制。
@devoured yep - 就是这样。 – 2009-09-20 23:32:38
此外,这是一个习惯于说“someConst == myVar”,其中someConst在这种情况下恰好为null的习惯。某些脚本语言可能会将上述内容翻译为“someConst.equals(myVar)”,如果以相反的方式进行操作,您可能会得到一个NPE。 – Bugmaster 2009-09-20 23:33:48
更正:C#不会让你这样做。 – Noldorin 2009-09-20 23:34:09