【问题标题】:Why is short-circuiting not the default behavior in VB?为什么短路不是 VB 中的默认行为?
【发布时间】:2010-10-03 22:58:10
【问题描述】:

VB 有运算符AndAlsoOrElse,它们执行短路 逻辑连接。

为什么这不是 AndOr 表达式的默认行为,因为短路在每种情况下都很有用。

奇怪的是,这与 &&|| 执行短路的大多数语言相反

【问题讨论】:

    标签: vb6 operators language-design short-circuiting


    【解决方案1】:

    因为 VB 团队必须保持与旧代码(和程序员!)的向后兼容性

    如果短路是默认行为,按位操作会被编译器错误地解释。

    The Ballad of AndAlso and OrElse 来自 Panopticon Central

    我们的第一个想法是逻辑运算比位运算更常见,因此我们应该将 And 和 Or 设为逻辑运算符,并添加新的位运算符 BitAnd、BitOr、BitXor 和 BitNot(最后两个是为了完整性)。然而,在其中一个测试版中,很明显这是一个非常糟糕的主意。 VB 用户忘记了新运算符的存在,并在他的意思是 BitAnd 和 Or 的意思时使用 And,当他的意思是 BitOr 时,会得到可以编译但产生“坏”结果的代码。

    【讨论】:

    • 实际上,如果规则是按位“或”运算符将评估右手操作数,则可以在不破坏不依赖副作用的代码的情况下向按位运算符添加短路行为除非左侧操作数等于结果类型的所有位设置值。另一方面,一些现有代码——甚至是AndOr 的两个操作数都由关系运算符生成的代码——确实依赖于对布尔运算符两边求值的副作用。
    • 链接已失效,但内容在这里。谢谢!
    • 链接已修复!链接万岁!
    【解决方案2】:

    我并不认为短路在所有情况下都有用。我只在需要时使用它。例如,当检查两个不同且未连接的变量时,就不需要了:

      If x > y And y > z Then
    
      End If
    

    正如 Paul Vick 的文章所说明的(参见上面 Ken Browning 提供的链接),短路很有用的完美场景是首先检查对象是否存在,然后评估其属性之一.

      If x IsNot Nothing AndAlso x.Someproperty > 0 Then
    
      End If
    

    所以,在我看来,这两个语法选项都是非常需要的。

    【讨论】:

    • 但是在您的第一个示例中,如果 x
    • 如果 2 个条件完全互斥,则可能不需要短路。这也很大程度上取决于开发人员的意图。如果开发人员希望同时执行这两个条件,则有一个后备方案会强制执行这两个条件。在必须检查对象是否存在的情况下,短路变得很方便。
    【解决方案3】:

    显式短路确保首先计算左操作数。

    在 VB 以外的某些语言中,逻辑运算符可能会执行隐式短路,但可能会先计算右运算符(例如取决于逻辑运算符左右表达式的复杂性)。

    【讨论】:

      猜你喜欢
      • 2012-02-27
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多