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