<分区>
Possible Duplicate:
Should I always use the AndAlso and OrElse operators?
在所有场景的实际实现中,逻辑表达式将为 And
和 AndAlso
返回相同的 bool 值,
为什么我们不总是使用 AndAlso
并在前一个条件为假时节省下一个条件的处理时间?换句话说,为什么 And
仍在使用?
<分区>
Possible Duplicate:
Should I always use the AndAlso and OrElse operators?
在所有场景的实际实现中,逻辑表达式将为 And
和 AndAlso
返回相同的 bool 值,
为什么我们不总是使用 AndAlso
并在前一个条件为假时节省下一个条件的处理时间?换句话说,为什么 And
仍在使用?
最佳答案
VB.NET 中的 And 运算符执行两个 作业,它既是逻辑运算符又是数学运算符。早期版本的 Visual Basic 不区分这两者。根据设计,该语言被设计为易于使用,并且语言设计者希望避免迫使 Visual Basic 程序员了解差异。
虽然它给语言带来了一些怪癖,但效果很好。例如,True 的值不是 1,就像在许多语言中一样,它是 -1。您从 CInt(True) 获得的值。这允许忽略运算符的两种用法之间的差异,当 If() 语句使用 And 时,它仍然可以正常工作,例如,当左侧是整数而右侧是 bool 值时。
但是 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 是逻辑版本。
关于.net - 为什么 AndAlso 不能替代 And,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13782516/