【问题标题】:why AndAlso is not a replacement to And [duplicate]为什么 AndAlso 不能替代 And [重复]
【发布时间】:2012-11-26 18:40:39
【问题描述】:

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

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

为什么我们不总是使用AndAlso 并在前一个条件为假时节省下一个条件的处理时间?也就是说,为什么And还在使用?

【问题讨论】:

  • 既然 99.99% 的使用应该是 AndAlso,为什么不把 AndAlso 变成 AndAnd 变成另一个关键字?

标签: .net vb.net


【解决方案1】:

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...ThenGoTo 逻辑。
  • @Neolisk:通常假设AndAlsoAnd - 想象一下:If AliensExist () And WaitForAliens () Then ... - 这将阻塞直到外星人到达,即使外星人没有'不存在。使用 AndAlso,如果外星人不存在,它不会阻止。
  • @RolfBjarneKvinge:If a = 5 AndAlso b = 7If a = 5 And b = 7 怎么样?
  • @Neolisk:JIT 很可能会将其优化为相同的代码。无论如何,如果存在差异,您必须循环运行数百万次才能检测到它。
【解决方案2】:

有时您希望两个部分都执行,以产生副作用。并非一切都是纯函数。另外:我假设我们在谈论布尔值,但在整数等的情况下,And 表示按位运算。

【讨论】:

  • 感谢您的回答,当AndAlso 无效时,您能否举一个在整数中使用And 的示例,
  • @Ala 如:5 和 3 ===> 1
  • 当 VB.Net 刚出现时,他们制作了单独的按位运算符,称为 BitAnd 和 BitOr,但随后对其进行了更改,以便 And 和 Or 运算符进行按位运算,并添加了 AndAlso 和 OrElse 用于短路。跨度>
  • @ChrisDunaway:很有趣。不知道。
猜你喜欢
  • 2015-09-03
  • 2012-01-14
  • 2010-09-23
  • 2011-10-06
  • 2018-04-26
  • 2016-08-24
  • 2020-01-27
  • 2015-06-27
相关资源
最近更新 更多