2017-05-31 44 views
-1

当检查如果一个对象等于某个值,是有之间的一些差异:操作数的顺序是否与比较运算符有关?

myObject == someValue 

someValue == myObject 

换句话说,不比较运算符的操作数的顺序有关系吗?这是编码风格的问题吗?

我一直在使用前者,但一个项目一直在使用后者,这是我以前从未见过的。

例如

if (data != null) 
    data.Write(writer); 

if (null != data) 
    data.Write(writer); 
我一直在使用前者,而在该项目的一些成员已经使用后者

谢谢。

+0

唯一的区别在于可读性。当硬编码值位于比较运算符的右侧时,大多数人发现它更易读。 –

+2

问题,事实并非如此。 '(null!= data)'通俗地称为“尤达条件”。五年前,我为了目前的工作而异想天开地采访了一位专家,但他们仍然对此表示不满。我通常只会在另一个操作数是长方法调用或其他操作数时才这样做,并且首先将常量放在第一个果实可读的位置,但在这种情况下,您应该将它分配给本地。 –

回答

2

我不认为有任何区别,或者至少没有一个编译器不会优化到同样的事情。

您正在观察的内容通常称为Yoda Conditions。 (因为大声朗读时的条件听起来像语言的风格,类似于尤达所说的。)他们大多是个人喜好的问题。

人谁主张他们是很快指出优点,例如:

if (something = true) 

会产生一个运行时错误,而:

if (true = something) 

会产生一个编译错误,并立即被捕获。尽管我会反驳说单元测试应该在发现错误之前找到错误。同样会争辩说,来自团队中其他程序员的任何混淆(即使只是你发布这个问题的闲散的好奇心)在项目上失去了时间。但我离题:)

+1

也,'if(something = null)'应该产生一个警告。 –

+0

@MikeNakis:可能取决于编译器和语言,但我同意它应该是。 – David

+2

@MikeNakis它不会产生任何警告,它会产生一个编译器错误,因为表达式不会在'if'语句中解析为布尔值。如果代码是'something = true' *,那么代码可以实际编译,如果代码是代码,它不会产生警告。 – Servy

0

他们在我看来是一样的。如果我说:

(1 != 2) = true 

(2 != 1) = true 

两者都会导致相同的答案。我能想到的唯一的事情就是如果你在哪里工作,就有一种编码标准需要某种方式或者其他方式(我从来没有见过这样的编码标准)。我会坚持你目前正在从事的项目正在做的事情。