为啥使用 And 而不是 AndAlso?

Posted

技术标签:

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

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

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

【问题讨论】:

What is the difference between And and AndAlso in VB.net? 的可能重复项 我相信我了解两者之间的区别。我的问题更多是关于为什么 And 更可取。 (OrElse and Or) and (AndAlso and And) - When to use?的可能重复 同样的问题...该链接讨论了代码正确性,我相信我理解。 根据链接很清楚。 AND 是按位运算符并计算双方,如果您不需要这样做,则使用 AndAlso。 【参考方案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】:

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

【讨论】:

以上是关于为啥使用 And 而不是 AndAlso?的主要内容,如果未能解决你的问题,请参考以下文章

VB.NET入门 ANDALSO 和OrElse 之于 AND,OR

为啥这个查询使用 where 而不是索引?

相当于SQL中的VB AndAlso?

为啥 Haskell 中的递归习语是“'n+1' and 'n'”而不是“'n' and 'n-1'”?

为啥和运算符在 vb.net

布尔运算符 && 和 ||