为什么AndAso也不是And的替代者

时间:2012-12-08 22:19:35

标签: .net vb.net

  

可能重复:
  Should I always use the AndAlso and OrElse operators?

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

为什么我们不使用always AndAlso并在前一个为false时保存下一个条件的处理时间?换句话说,为什么And仍然在使用?

2 个答案:

答案 0 :(得分:5)

VB.NET中的And运算符执行两个作业,它既是逻辑运算符,也是数学运算符。早期版本的Visual Basic没有区分这两者。通过设计,该语言被设计为易于使用,并迫使Visual Basic程序员学习语言设计者希望避免的差异。

虽然它给语言带来了一些怪癖,但效果还算不错。例如,True的值不是1,就像在许多语言中一样,它是-1。您从CInt(True)获得的价值。这允许忽略运算符的两个用法之间的差异,当If()语句使用时它仍然有效。当左侧是整数而右侧是布尔值时,它仍然有效。

但是And操作员扮演这两个角色是一个非常具体的问题。一个常见的用法是写一个这样的语句:

If ix < array.Length And array(ix) <> 42 Then
   '' do something
End If

这是一个声明,会使您的代码因IndexOutOfRangeException而崩溃。你意味着什么是&#34;如果索引超出范围,那么就不用费心去检查数组元素&#34;。这被称为&#34;短路评估&#34;。但这不是And运算符所做的,它会评估左右表达式。就像And运算符的数学版本一样。

短路评估非常重要,并且已经存在很长时间了。并且普遍采用卷括号语言,从C开始。它最终也被VB.NET采用,你这样写就是为了避免异常:

If ix < array.Length AndAlso array(ix) <> 42 Then
   '' do something
End If

所以回答你的问题:是的,当你打算使用And运算符的逻辑版本时,总是使用AndAlso。并且的逻辑版本。

答案 1 :(得分:1)

有时您希望执行两个部分,以产生副作用。并非一切都是纯粹的功能。另外:我假设我们正在谈论布尔值,但在整数等情况下,并且意味着按位操作。