VB.NET';如果';带有'的语句;或';双方都评估过了吗?

VB.NET';如果';带有'的语句;或';双方都评估过了吗?,.net,vb.net,.net,Vb.net,快速问题,其中最快和最简单的答案可能是重新排列相关代码,但让我们看看 因此,我使用VB.NET重写了一个If语句(一段代码,它是用C#编写的完整工作解决方案的一部分)。我知道VB.NETIIf(a,b,c)方法会对b和a进行评估,而不管第一次评估的真实性如何,但在我的标准构造中似乎也是如此: If (example Is Nothing Or example.Item IsNot compare.Item) Then 'Proceed End If 或者更恰当地说: If (examp

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

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

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
在这里,如果
示例
),那么我仍然会得到一个
空引用异常
-这是我的错,还是我只是在VB.NET的突发奇想下不得不忍受的事?

是短路等价物

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

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

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

所以你可能想要:

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

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

在99.9%的情况下,你应该使用
OrElse
以及
而不是
。太棒了,Jon,我发现整个VB都是冗长和丑陋的;希望这是一种(再次)写的东西。它可能冗长,但丑陋是品味的问题。冗长也可能意味着可读,我认为这只是习惯的问题。@Tim Euclid的元素很容易阅读,与这种语言相比更容易阅读。@Jeff O:不要对我太苛刻。。)@罗伊纳米尔:仅仅因为它们都被翻译成了IL,并不意味着它们被翻译成了同一个IL。这些语言以不同的方式指定运算符的行为-
等同于
|
,而
更接近于
|