【发布时间】:2012-11-26 18:40:39
【问题描述】:
在所有场景的实际实现中,逻辑表达式将为And 和AndAlso 返回相同的布尔值,
为什么我们不总是使用AndAlso 并在前一个条件为假时节省下一个条件的处理时间?也就是说,为什么And还在使用?
【问题讨论】:
-
既然 99.99% 的使用应该是
AndAlso,为什么不把AndAlso变成And而And变成另一个关键字?
在所有场景的实际实现中,逻辑表达式将为And 和AndAlso 返回相同的布尔值,
为什么我们不总是使用AndAlso 并在前一个条件为假时节省下一个条件的处理时间?也就是说,为什么And还在使用?
【问题讨论】:
AndAlso,为什么不把 AndAlso 变成 And 而 And 变成另一个关键字?
VB.NET 中的And 运算符执行两个 工作,它既是逻辑运算符又是数学运算符。 Visual Basic 的早期版本不区分这两者。按照设计,该语言被设计为易于使用,并迫使 Visual Basic 程序员学习差异是语言设计者想要避免的。
虽然它给语言带来了一些怪癖,但效果很好。例如 True 的值不是 1,就像在许多语言中一样,它是 -1。您从 CInt(True) 获得的值。这允许忽略运算符的两种用法之间的差异,当 If() 语句使用 And 时,它仍然可以很好地工作,例如,当左侧是 Integer 而右侧是 Boolean 时。
但是,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 慢吗?它必须在幕后添加一些If...Then 和GoTo 逻辑。
AndAlso 比And快 - 想象一下:If AliensExist () And WaitForAliens () Then ... - 这将阻塞直到外星人到达,即使外星人没有'不存在。使用 AndAlso,如果外星人不存在,它不会阻止。
If a = 5 AndAlso b = 7 和 If a = 5 And b = 7 怎么样?
有时您希望两个部分都执行,以产生副作用。并非一切都是纯函数。另外:我假设我们在谈论布尔值,但在整数等的情况下,And 表示按位运算。
【讨论】:
AndAlso 无效时,您能否举一个在整数中使用And 的示例,