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

Ala*_*laa 3 .net vb.net

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

在所有情况下实际的实现,逻辑表达式将返回相同的布尔值两个AndAndAlso,

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

Han*_*ant 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
Run Code Online (Sandbox Code Playgroud)

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

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

If ix < array.Length AndAlso array(ix) <> 42 Then
   '' do something
End If
Run Code Online (Sandbox Code Playgroud)

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