5

我确信这个问题之前可能已经回答过,所以我很抱歉,但我无法找到合适的搜索词来找到答案。

给定以下代码示例,是否db.GetRecords().Any()会执行?

string s = "Z";
bool x = s.IndexOfAny(new[] { 'A', 'B' }) > 0 &&
         db.GetRecords().Any();
4

6 回答 6

10

不会。两者&&||通过短路评估进行评估。这意味着如果为假a && b则返回假,如果为真则返回真,并且在这两种情况下都不会评估。aa || bab

如果由于某种原因您不想进行短路评估,则可以使用按位运算符&|.

于 2010-10-22T14:13:11.950 回答
2

不,&&运算符短路(这意味着它在表达式的任何部分计算为假后停止计算表达式)。

||运算符也会短路,但在表达式的任何部分计算为真后停止计算。

于 2010-10-22T14:11:18.663 回答
2

不,C# 使用短路和。所以答案是否定的。

如果您需要同时评估两者,请使用 NON-SHORT-CIRCUIT 运算符,仅使用一个 & 符号&

tring s = "Z";
bool x = s.IndexOfAny(new[] { 'A', 'B' }) > 0 &
         db.GetRecords().Any();

请注意单个&

于 2010-10-22T14:11:34.647 回答
2

我说对于 C# 逻辑与 ( &&),表达式为假的第二个,因为它们都需要为真,表达式才能为真,编译器立即停止评估。

&& 运算符(C# 参考)

条件与运算符 (&&) 对其布尔操作数执行逻辑与,但仅在必要时评估其第二个操作数。

与逻辑与相反,逻辑或 ( ||) 只需要所有表达式中的一个表达式为真,整个表达式为真。false因此,运算符不是在评估上短路,而是||使编译器在真正的评估上短路。

|| 运算符(C# 参考)

现在,这就是 C# 编译器的行为,但这并不意味着每个编译器都采用这种方式,就像在 VB.NET 中一样,您有两个逻辑与运算符 ( And, AndAlso) 和两个逻辑或运算符 ( Or, OrElse)。And用于按位和逻辑连接的运算符不会在第一个表达式返回 false 时短路并无论如何评估另一个表达式,而AndAlso当第一个逻辑表达式为 false 时将短路评估。这与Orand相同OrElse,其中Or不短路,并且OrElse确实。

和运算符 (Visual Basic)

对两个布尔表达式执行逻辑连接,或对两个数值表达式执行按位连接。

AndAlso 运算符 (Visual Basic)

对两个表达式执行短路逻辑合取。

或运算符 (Visual Basic)

对两个布尔表达式执行逻辑析取,或对两个数值表达式执行按位析取。

OrElse 运算符 (Visual Basic)

对两个表达式执行短路包含逻辑析取。

简而言之,我想说这取决于您正在使用的编译器。至于C#,它确实短路了。

于 2010-10-22T14:32:36.683 回答
1

它是短路的,允许您执行以下操作:

if(ob && ob.somefunc()) { ... }

如果对这两个操作都进行了评估,则可能会引用一个空对象,这将是一个运行时异常。

于 2010-10-22T14:15:36.937 回答