2009-09-20 88 views

回答

20

避免myVar = null(哎呦)的意外错字是个老习惯。它在某些语言中仍然有用,但C#会保护您免于这样做,因此在那里没有必要。

+0

@devoured yep - 就是这样。 – 2009-09-20 23:32:38

+0

此外,这是一个习惯于说“someConst == myVar”,其中someConst在这种情况下恰好为null的习惯。某些脚本语言可能会将上述内容翻译为“someConst.equals(myVar)”,如果以相反的方式进行操作,您可能会得到一个NPE。 – Bugmaster 2009-09-20 23:33:48

+0

更正:C#不会让你这样做。 – Noldorin 2009-09-20 23:34:09

8

这是从C缓缴较旧的编译器不会赶上这样的:

if (foo = null) 

当你的意思是这样的:

if (foo == null) 

经典笑话的例子是这样的错误:

if (fireTheNukes = true) 
    fireTheNukes(); 

这通常被认为是一种古老的模式,因为任何值得它的盐的编译器都会在一个条件语句。我会在你的代码中避免这种模式,因为它现在没有任何用处。

+0

@Andrew:我认为if(foo = null)是一个完全有效的语句(赋值给foo,然后检查它是否为真)。我认为这与编译器没有“捕捉”它有什么关系。 – 2009-09-20 23:45:08

+0

@Esteban - 什么语言和编译器?虽然C#编译器_will_允许在条件语句中进行布尔赋值,但它也会生成一个“你真的想要这么做吗?”警告。 – 2009-09-21 00:01:29

2

这是一个古老的防御习惯。如果将常量放在左侧,则忘记第二个等号会导致编译错误。在更正常的格式中,忘记第二个等号会导致将null分配给变量。

换句话说,

myVar = null 

是有害的,令人惊讶,而

null = myVar 

得到由编译器捕获。

2

这是C程序员的习惯,在这种情况下,C程序员已经习惯了C#,但实际上完全没有必要。

考虑在C中,如果您不小心键入if (myVar = null),编译器将执行分配,而不是抱怨。围绕myVarnull的顺序进行切换确保如果==无意错误输入为=,则会生成编译器错误。但是,C#在这两种情况下都会生成编译器警告,所以这个怪癖是不必要的。

2

它来自C/C++赶留出一个等号:

myVar = null 

但它不是在C#中需要的。

1

正如其他人所提到的,这是一种针对可能由于在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 

然而,这样的代码的存在往往是一个糟糕的代码气味可能是最好的重构,使代码更清晰处理被抑制。

相关问题