在所有场景的实际实现中,逻辑表达式将为和返回相同的布尔值And
,AndAlso
为什么我们不使用 alwaysAndAlso
并在前一个条件为假时节省下一个条件的处理时间?换句话说,为什么And
还在使用?
在所有场景的实际实现中,逻辑表达式将为和返回相同的布尔值And
,AndAlso
为什么我们不使用 alwaysAndAlso
并在前一个条件为假时节省下一个条件的处理时间?换句话说,为什么And
还在使用?
VB.NET 中的 And 运算符执行两项工作,它既是逻辑运算符又是数学运算符。Visual Basic 的早期版本不区分这两者。按照设计,该语言被设计为易于使用,并迫使 Visual Basic 程序员学习差异是语言设计者想要避免的。
虽然它给语言带来了一些怪癖,但效果很好。例如 True 的值不是 1,就像在许多语言中一样,它是 -1。您从 CInt(True) 获得的值。这允许忽略运算符的两种用法之间的差异,例如,当 If() 语句使用 And 当左侧是整数而右侧是布尔值时,它仍然可以很好地工作。
但是 And 运算符同时扮演这两个角色存在一个非常具体的问题。一个常见的用法是编写如下语句:
If ix < array.Length And array(ix) <> 42 Then
'' do something
End If
该语句将使您的代码因 IndexOutOfRangeException 而崩溃。您的意思是“如果索引超出范围,则不要费心检查数组元素”。这就是所谓的“短路评估”。但这不是 And 运算符所做的,它计算左右表达式。就像And 运算符必须做的数学版本一样。
短路评估很重要,并且已经存在了很长时间。并且在花括号语言中被普遍采用,从 C 开始。它最终也被 VB.NET 采用,你这样写以避免异常:
If ix < array.Length AndAlso array(ix) <> 42 Then
'' do something
End If
因此,回答您的问题:是的,当您打算使用And 运算符的逻辑版本时,请始终使用 AndAlso。AndAlso是合乎逻辑的版本。
有时您希望两个部分都被执行,以产生副作用。并非一切都是纯函数。另外:我假设我们正在谈论布尔值,但在整数等的情况下,And 表示按位运算。