3

可能重复:
我应该始终使用 AndAlso 和 OrElse 运算符吗?

在所有场景的实际实现中,逻辑表达式将为和返回相同的布尔值AndAndAlso

为什么我们不使用 alwaysAndAlso并在前一个条件为假时节省下一个条件的处理时间?换句话说,为什么And还在使用?

4

2 回答 2

5

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合乎逻辑的版本。

于 2012-12-08T22:58:11.793 回答
1

有时您希望两个部分都被执行,以产生副作用。并非一切都是纯函数。另外:我假设我们正在谈论布尔值,但在整数等的情况下,And 表示按位运算。

于 2012-12-08T22:22:45.713 回答