【问题标题】:Why use And over AndAlso?为什么使用 And 而不是 AndAlso?
【发布时间】:2015-09-03 04:59:01
【问题描述】:

我对 .NET 编程还很陌生,最近偶然发现了 AndAlso。据我了解,AndAlso 评估第一个表达式,如果它为真,那么它评估第二个......等等。另一方面,总是计算表达式中的所有项。

如果我的理解是正确的,那么 AndAlso 是否总是(略微)更有效率。如果是这种情况,为什么要使用 And 呢?

【问题讨论】:

标签: .net vb.net


【解决方案1】:

And 是按位的。 AndAlso 是布尔值。

正确性,如果我们不考虑短路,And 总是可以在所有可以使用AndAlso 的情况下使用 (unless you get creative),但反之则不行真的。

也就是说,And 是一个“通用”运算符,它将在按位和逻辑上下文中“做正确的事情”,但没有针对任何一个进行优化。 AndAlso 只能在布尔上下文中使用,但已针对它进行了优化。

Visual Basic 过去没有AndAlso,所以And 是唯一的选择。现在VB有AndAlsoAnd应该可以用于:

  • 按位数学(对两个数字执行bitwise AND
  • 具有副作用的表达式(您希望禁用短路并始终计算表达式的两个部分)。我当然不会将此称为推荐做法,因为您最终可能会得到非常不明显的代码,但如果您有从 VB6 升级的旧代码,这可能没问题。

【讨论】:

  • 在 if 语句的第二部分有一个带有副作用的表达式将是一个很大的代码气味。所以And 真的应该只用于按位数学。
  • @Meta-Knight 我并不是要说一个人应该真正去做,而是说它可以做到,并且它将AndAndAlso 区分开来。哦等等,我确实说过“应该……”
【解决方案2】:

也许这是个人选择。但我倾向于认为And 应该永远使用。
当然,按位运算需要And,但这并不是真正的问题(您无法选择AndAndAlso 之间的按位连接)。
我不喜欢“副作用”的把戏;如果您想要副作用执行它们并然后测试结果值

Dim result1 = SideEffect1(), result2 = SideEffect2()
If result1 AndAlso result2 Then ' ...

恕我直言比

If SideEffect1() And SideEffect2() Then ' ...

意图更明确,但肯定两种方式都可行。

【讨论】:

    【解决方案3】:

    如果您有一个带有副作用的表达式,这将很有用。例如,您的第二个表达式是您始终想要运行的函数,无论它之前的计算结果如何。

    【讨论】:

      猜你喜欢
      • 2012-01-14
      • 2012-11-26
      • 2010-09-23
      • 2011-08-26
      • 1970-01-01
      • 2016-12-31
      • 1970-01-01
      • 2012-08-22
      相关资源
      最近更新 更多