【问题标题】:VB.NET 'If' statement with 'Or' conditional has both sides evaluated?带有'Or'条件的VB.NET'If'语句双方都评估了吗?
【发布时间】:2011-01-18 10:56:57
【问题描述】:

快速的问题,其中最快和最简单的答案可能是重新排列相关代码,但让我们看看......

所以我有一个使用 VB.NET 重写的 If 语句(一段代码,它是用 C# 编写的完整工作解决方案的一部分)。我知道 VB.NET IIf(a, b, c) 方法会同时评估 ba 而不管第一次评估的真实性如何,但是这 似乎 在我的标准构造中也是如此:

If (example Is Nothing Or example.Item IsNot compare.Item) Then
    'Proceed
End If

或者,更恰当地说:

If (example Is Nothing Or Not example.Item = compare.Item) Then
    'Proceed
End If

在这里,如果 exampleNothing (null),那么我仍然会得到 NullReferenceException - 这是我的错,还是我必须忍受 VB.NET 的突发奇想?

【问题讨论】:

  • 在 99.9% 的情况下,您应该使用 OrElseAndAlso 而不是 orand

标签: .net vb.net


【解决方案1】:

这是你的“错”,因为Or 是这样定义的,所以这是你应该期待的行为:

在布尔比较中,Or 运算符始终计算两个表达式,这可能包括进行过程调用。 OrElse 运算符 (Visual Basic) 执行短路,这意味着如果表达式 1 为 True,则不计算表达式 2。

但你不必忍受它。您可以使用OrElse 来获得短路行为。

所以你可能想要:

If (example Is Nothing OrElse Not example.Item = compare.Item) Then
    'Proceed
End If

我不能说它读起来非常好,但它应该可以工作......

【讨论】:

  • 太棒了,乔恩,我发现整个 VB 既冗长又丑陋;希望这是一次(再次)写入的事情。
  • 它可能很冗长,但丑陋是一个品味问题。冗长也可能意味着可读,我认为这只是习惯的问题。
  • @Tim Euclid 的 Elements 很容易阅读,与这种语言相比更是如此。
  • @Jeff O:不要太苛刻地评价我。 ;)
  • @RoyiNamir:仅仅因为它们都被翻译成 IL 并不意味着它们被翻译成 same IL。语言对运算符的行为有不同的规定——OrElse 等价于||,而Or 更接近|
【解决方案2】:

OrElseOr 的短路等效项

【讨论】:

    猜你喜欢
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2019-08-15
    • 2016-10-08
    • 1970-01-01
    • 2019-06-06
    相关资源
    最近更新 更多