我确定此问题可能已经得到了解答,所以我道歉,但我无法找到合适的搜索字词来找到答案。
鉴于以下代码示例,db.GetRecords().Any()
是否已执行?
string s = "Z";
bool x = s.IndexOfAny(new[] { 'A', 'B' }) > 0 &&
db.GetRecords().Any();
答案 0 :(得分:8)
没有。 &&
和||
都由short-circuit evaluation评估。这意味着如果a && b
为false,a
将返回false,如果a || b
为true,则a
将返回true,并且在这两种情况下都不会评估b
。
如果由于某种原因您不想进行短路评估,可以使用按位运算符&
和|
。
答案 1 :(得分:2)
没有。 &&
运算符短路(这意味着它在表达式的任何部分求值为false后停止计算表达式。)
||
运算符也会短路但在表达式的任何部分求值为true后停止计算。
答案 2 :(得分:2)
不,C#使用短路和。所以答案是没有。
如果您需要同时评估两者,请使用NON-SHORT-CIRCUIT运算符,只使用一个&符号& 。
tring s = "Z";
bool x = s.IndexOfAny(new[] { 'A', 'B' }) > 0 &
db.GetRecords().Any();
请注意单个& 。
答案 3 :(得分:2)
答案 4 :(得分:2)
我说对于C#logic-AND(&&
),表达式为假的第二个,因为它们都需要为true才能使表达式为true,编译器会立即停止计算。
条件AND运算符(&&)执行其bool操作数的逻辑AND,但只在必要时才计算其第二个操作数。
与逻辑AND相反,逻辑OR(||
)只需要一个表达式中的一个表达式为真,因为整个表达式为真。因此,false
运算符不是在||
评估之间短路,而是使编译器在真正的评估中短路。
<强> || Operator (C# Reference) 强>
现在,这就是C#编译器的行为,但这并不意味着每个编译器都会这样做,就像在VB.NET中一样,你有两个逻辑AND运算符(And
,{{3} })和两个逻辑或运算符(Or
,OrElse
)。用于按位和逻辑连接的And
运算符在第一个表达式返回false时不会短路并且无论如何都会评估另一个,而AndAlso
会在第一个逻辑表达式时使评估短路是假的。这与Or
和OrElse
相同,其中Or
不会短路,OrElse
会发生短路。
<强>
AndAlso
强>对两个布尔表达式执行逻辑连接,或对两个数值表达式执行按位连接。
对两个表达式执行短路逻辑连接。
AndAlso Operator (Visual Basic)
对两个布尔表达式执行逻辑析取,或对两个数值表达式执行按位析取。
<强> Or Operator (Visual Basic) 强>
对两个表达式执行包含短路的逻辑分离。
简而言之,我会说这取决于您正在使用的编译器。至于C#,它确实会发生短路。
答案 5 :(得分:1)
它是短路的,允许你做这样的事情:
if(ob && ob.somefunc()) { ... }
如果两个操作都被评估,那么就有可能引用一个空对象,这将是一个运行时异常。