2012-02-04 24 views
2

语句是有之间的差异:有在两个区别,如果在C#

if (myObject != null && myObject.someint == 0) 
{ 
     // do something 
} 

​​

我一直认为它评估的首要条件,而如果为假,它跳过第二个评价。但是,我在运行时引用了空引用错误。 myObject为空,它试图检查myObject.someint

该对象可以在外部修改,当它检查对象存在的第一个条件时,但是当它进入下一个条件时,在myObject中?

如果它是后者,任何方法来避免(在我的脑海中b/c上述两种方法做if检查都是一样的)。只有我可以想象的是try/catch

+3

避免更好的方法:不要修改外部对象而不锁定。如果你可以描述在执行任何一条if语句时'myObject'可以设置为null的方式,那么你就有一个竞争条件,很简单。 – 2012-02-04 04:55:16

回答

6

它必须是自& &短路false以来的后期条件。使用

lock(myObject) 
+0

同意你有多线程问题。需要锁定您对myObject – 2012-02-04 04:57:46

+0

+1的访问权限。突出了对锁定的需求。 – 2012-02-04 04:59:44

3

C#使用短路评估,因此它们是等效的。

有条件-AND运算符(& &)进行逻辑与它的布尔的 操作数,但如果必要的话只有评价其第二操作数。 Ref

但@pst指出,它可能是一个线程问题。

+2

+1 ......并且如果“外部修改”意味着多线程,则两者同样破裂......尽管看看IL世代中的一个对这些情况是否“更具适应性”会很有趣。 – 2012-02-04 04:56:48

-3

第一个将检查2个条件,它可能会在第二个状态myObject.someint = 0,如果第一个条件是Null抛出一个异常..

第二个将首先检查对象不是Null然后继续下一个检查,否则它不会继续。在这种情况下不会有任何异常抛出..

所以基本上,我会选择第二个。它不会抛出异常,我不需要使用try/catch thingy ...

+1

-1,这两个片段是相同的,因为他们写。 '&&'操作符短路,这意味着如果第一个条件评估为false,则不评估第二个条件。正如你所描述的那样,它们不一定都要被评估。 – Marlon 2012-02-04 05:09:27