假设myObj为空。写这个安全吗?
if(myObj != null && myObj.SomeString != null)
我知道某些语言不会执行第二个表达式,因为&&在执行第二部分之前评估为false。
是。在C#&&和||被短路,从而评估右侧只有左侧尚不确定结果。运营商&和|在另一方面也不短路,并始终评估两侧。
&&
||
&
|
规格说明:
在&&与||运营商被称为条件逻辑运算符。它们也称为“短路”逻辑运算符。 … 该运算x && y符与该运算符相对应x & y,但y仅当x为true … 时才进行 运算。换句话说,首先被评估并转换为type 。然后,如果是,进行评估并将其转换为类型,并且这成为操作的结果。否则,运算结果为。x && y``(bool)x ? (bool)y : false``x``bool``x``true``y``bool``false
x && y
x & y
y
x
true
x && y``(bool)x ? (bool)y : false``x``bool``x``true``y``bool``false
(C#语言规范版本4.0-7.12条件逻辑运算符)
的一个有趣的性质&&,并||为它们短路,即使他们不上的bool操作,但如果用户重载运营商的类型&或|与一起true和false运营商。
false
该操作x && y的计算方式为T.false((T)x) ? (T)x : T.&((T)x, y),其中 T.false((T)x)是在中operator false声明的调用T,而T.&((T)xy)是对选定对象的调用operator &。此外,值(T)x仅应评估一次。 换句话说,x首先要求值并将其转换为type,T然后operator false对结果进行调用以确定是否x绝对是false。 然后,如果x是肯定的话false,则运算的结果是先前计算出的值,以x转换为type T。 否则,y将对其求值,然后对&先前计算出的要x转换为type T的值和计算出的y要产生操作结果的值调用所选的运算符。
该操作x && y的计算方式为T.false((T)x) ? (T)x : T.&((T)x, y),其中 T.false((T)x)是在中operator false声明的调用T,而T.&((T)xy)是对选定对象的调用operator &。此外,值(T)x仅应评估一次。
T.false((T)x) ? (T)x : T.&((T)x, y)
T.false((T)x)
operator false
T
T.&((T)x
operator &
换句话说,x首先要求值并将其转换为type,T然后operator false对结果进行调用以确定是否x绝对是false。 然后,如果x是肯定的话false,则运算的结果是先前计算出的值,以x转换为type T。 否则,y将对其求值,然后对&先前计算出的要x转换为type T的值和计算出的y要产生操作结果的值调用所选的运算符。
(C#语言规范版本4.0-7.12.2用户定义的条件逻辑运算符)