今天才发现 And 和 AndAlso 的区别

原创 2004年07月15日 00:50:00

以前见过AndAlso,但一直都没有放在心上,也没有查资料看看它们之间到底是什么关系。

今天一看,才发现使用它们的效果是不一样的,原以为And 就和C++中的 && 一个样子(都是短路的),没想到And不短路,而AndAlso才是短路的。看来以后是该用AndAlso的就用AndAlso,该用And的就用And 。

e.g.
        Dim i As Int32
        Dim s() As String

        i = 0

        If i = 1 AndAlso s(1) = "1" Then
            MessageBox.Show("不可能到这里")
        Else
            MessageBox.Show("AndAlso可以短路啊")
        End If

        If i = 1 And s(1) = "1" Then       '错误 其他信息: 未将对象引用设置到对象的实例。
            MessageBox.Show("不可能到这里")
        Else
            MessageBox.Show("也不可能到这里")
        End If

OrElse类似

以下是MSDN上的说明

短路运算符

逻辑运算符 AndAlsoOrElse 表现称为“短路”的行为。短路运算符首先计算左侧表达式。如果左侧表达式使整个表达式为假(在 AndAlso 中)或验证(在 OrElse 中)整个表达式,则程序执行过程继续,而不计算右侧表达式。请见下面的示例:

If 45 < 12 AndAlso MyFunction(3) = 81 Then ' Add code to continue execution.

在此示例中,运算符计算左侧表达式 45 < 12。因为此表达式计算为 False,所以整个逻辑表达式计算为 False。程序执行过程因此开始执行 If 块内的代码,而不计算右侧表达式 MyFunction(3)。在此示例中,永远不调用 MyFunction(),因为左侧表达式使整个表达式为假。

同样,如果使用 OrElse 的逻辑表达式中左侧表达式计算为 True,则执行过程继续下一行代码,而不计算第二个表达式,因为第一个表达式已经启用整个表达式。

相反,当使用逻辑运算符 AndOr 时,逻辑运算符的两侧都要计算。例如,请考虑下面的表达式:

If 45 < 12 And MyFunction(3) = 81 Then ' Add code to continue execution.

在此示例中,对 MyFunction() 进行调用,即使第一个表达式计算为 False

AndAlso 运算符

对两个表达式执行简化逻辑合取。
备注
如果编译的代码可以根据一个表达式的计算结果跳过对另一表达式的计算,则将该逻辑运算称为“短路”。如果第一个表达式的计算结果可以决定运算的最终结果,则不需要计算另一个表达式,因为它不会更改最终结果。如果跳过的表达式很复杂或涉及过程调用,则短路可以提高性能。
示例
本示例使用 AndAlso 运算符对两个表达式执行逻辑合取。结果是一个 Boolean 值,它表示整个联合表达式是否为真。如果第一个表达式为 False,则不计算第二个表达式。
Dim A As Integer = 10
Dim B As Integer = 8
Dim C As Integer = 6
Dim myCheck As Boolean
myCheck = A > B AndAlso B > C   ' True.
myCheck = B > A AndAlso B > C   ' False. Second expression not evaluated.
myCheck = A > B AndAlso C > B   ' False. Second expression evaluated.

Public Function FindValue(ByVal Arr() As Double, _
                          ByVal SearchValue As Double) As Double
   Dim I As Integer = 0
   While I <= UBound(Arr) AndAlso Arr(I) <> SearchValue
   ' If I is greater than UBound(Arr), SearchValue is not checked.
      I += 1
   End While
   If I >= UBound(Arr) Then I = –1
   Return I
End Function

OrElse 运算符

用于对两个表达式执行短路逻辑析取。

备注

如果编译的代码可以根据一个表达式的计算结果跳过对另一表达式的计算,则将该逻辑运算称为“短路”。如果第一个表达式的计算结果可以决定运算的最终结果,则不需要计算另一个表达式,因为它不会更改最终结果。如果跳过的表达式很复杂或涉及过程调用,则短路可以提高性能。
示例
本例使用 OrElse 运算符对两个表达式执行逻辑析取。结果是一个 Boolean 值,它表示两个表达式中是否有一个为真。如果第一个表达式为 True,则不计算第二个表达式。
Dim A As Integer = 10
Dim B As Integer = 8
Dim C As Integer = 6
Dim myCheck As Boolean
myCheck = A > B OrElse B > C   ' True. Second expression is not evaluated.
myCheck = B > A OrElse B > C   ' True. Second expression is evaluated.
myCheck = B > A OrElse C > B   ' False.

If MyFunction(5) = True OrElse MyOtherFunction(4) = True Then
' If MyFunction(5) is True, MyOtherFunction(4) is not called.
   ' Insert code to be executed.
End If

下面来看看And 和 Or
And 运算符
对两个 Boolean 表达式执行逻辑合取,或对两个数值表达式执行按位合取。
注意   由于逻辑/位运算符的优先级低于其他算术和关系运算符的优先级,所以应该将任何按位运算括在括号中以确保准确执行。如果操作数包括一个 Boolean 表达式和一个数值表达式,则结果 Boolean 表达式将转换为数值(-1 表示 True,0 表示 False),最终将进行按位运算。

Or 运算符
用于对两个 Boolean 表达式执行逻辑析取,或对两个数值执行按位析取。
注意   由于逻辑/位运算符的优先级低于其他算术和关系运算符的优先级,所以应该将任何按位运算括在括号中以确保准确执行。如果操作数包括一个 Boolean 表达式和一个数值表达式,则结果 Boolean 表达式将转换为数值(-1 表示 True,0 表示 False),最终将进行按位运算。


逻辑运算符(And、AndAlso、Or、OrElse、&&、&、||、|)

从学编程开始,在逻辑运算符方面一直有一个“短路”的概念。在使用.NET的过程中一直以为And、Or、&&、||这些逻辑运算符本身具有“短路”功能,直到开发过程中碰到这样的问题,查找MSDN后才发现原来...
  • kingmax54212008
  • kingmax54212008
  • 2015年11月02日 22:25
  • 2121

今天才发现 And 和 AndAlso 的区别

以前见过AndAlso,但一直都没有放在心上,也没有查资料看看它们之间到底是什么关系。 今天一看,才发现使用它们的效果是不一样的,原以为And 就和C++中的 && 一个样子(都是短路的),没想到An...
  • AntingZ
  • AntingZ
  • 2004年07月15日 00:50
  • 3313

VB AndAlso,OrElse和And,Or的区别

AndAlso和OrElse应该是vb。net引入的新运算符。 因为用vb。net的时间还不是很长,之前我一直以为他们和and,or根本没有区别。 现在终于明白,他们之间还是有很大区别的: ...
  • minsenwu
  • minsenwu
  • 2012年05月30日 14:23
  • 11505

今天才发现 And 和 AndAlso 的区别

  • zgqtxwd
  • zgqtxwd
  • 2008年04月24日 08:42
  • 120

今天才发现

原来jquery修改元素的css样式,是直接添加的行内样式. 如果你有用id或class 的样式与次冲突,会造成id或css中的样式失效.....
  • kofjjj
  • kofjjj
  • 2015年03月24日 19:11
  • 179

.NET Expression 从零开始三:运算符

本文介绍表达式中允许的运算符表达式,如一元、二元、三元运算符等等 会简易的提供几个运算应用的代码小示例 下面列出各个运算符表达式 一元运算符 ! // Expression.Not(Expressio...
  • liulilittle
  • liulilittle
  • 2017年06月08日 19:35
  • 334

EF中扩展出Between操作符

using System; using System.Linq; using System.Linq.Expressions;namespace FuLu.Finance.Assistant.Comm...
  • lee576
  • lee576
  • 2015年04月16日 15:49
  • 2533

BCDEdit 启动项编辑器4 zz

http://bbs.wuyou.net/viewthread.php?tid=158454&pid=1867618&page=1&extra=      9 写得很乱,大家凑合看了  补充...
  • mobilechan
  • mobilechan
  • 2013年05月04日 21:03
  • 482

今天才发现一片天地!

找软件下载,无意之间发现了多年的老朋友,那就是csdn下载屏道;这里我找到了我的所需,这里有一切你想要的内容,这里还能给你带来惊喜!     于是,我决心做csdn的忠实粉丝,陪它度过春夏秋冬,陪它走...
  • u013002331
  • u013002331
  • 2013年11月30日 10:29
  • 298

System.Linq.Expressions.Expression 的 320个方法、2个构造函数和3个属性

提供一种基类,表示表达式树节点的类派生自该基类。它还包含用来创建各种节点类型的static(在 Visual Basic 中为Shared)工厂方法。这是一个abstract 类。 方法...
  • educast
  • educast
  • 2012年08月23日 09:13
  • 6033
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:今天才发现 And 和 AndAlso 的区别
举报原因:
原因补充:

(最多只允许输入30个字)