VB.NET'如果'带有'或'条件的语句双方都进行了评估?

Gra*_*mas 27 .net vb.net

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

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

If (example Is Nothing Or example.Item IsNot compare.Item) Then
    'Proceed
End If
Run Code Online (Sandbox Code Playgroud)

或者更确切地说:

If (example Is Nothing Or Not example.Item = compare.Item) Then
    'Proceed
End If
Run Code Online (Sandbox Code Playgroud)

在这里,如果exampleNothing(null)然后我仍然得到NullReferenceException- 这是我的错,还是我只需要忍受VB.NET的一时兴起?

Jon*_*eet 53

这是你的"错误",因为它是如何Or定义的,所以这是你应该期望的行为:

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

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

所以你可能想要:

If (example Is Nothing OrElse Not example.Item = compare.Item) Then
    'Proceed
End If
Run Code Online (Sandbox Code Playgroud)

我不能说它读得非常好,但它应该有用......

  • 真棒,乔恩,我发现整个VB都是冗长而丑陋的; 希望这是一次写入(再次)的事情. (8认同)
  • @RoyiNamir:仅仅因为他们都被翻译成IL并不意味着他们被翻译成*同样的*IL.这些语言以不同的方式指定运算符的行为 - "OrElse"相当于"||",而"Or"更接近"|". (8认同)
  • 这可能是冗长的,但丑陋是一种品味问题.详细也可能意味着可读,我认为这只是一个习惯的问题. (4认同)

Ric*_*lay 22

OrElse 是短路的等价物 Or