2010-11-29 90 views
-3

我一直在Java(Mainly)和.Net中编写代码。||(或)Java中的逻辑运算符与.Net

我发现的是,.Net中的||逻辑运算符与Java中的||运算符的结果不同。

让我们看看下面的Java代码:

Object obj = null; 

if(obj == null || obj.toString().isEmpty()){ 
    System.out.println("Object is null"); 
} 

代码的结果将是:

对象为空

的原因是因为obj == nulltrue而第二个表达式没有被评估。如果是的话,我会收到一个java.lang.NullPointerException

如果我使用单个或(|),我也会收到一个NullPointerException(两者都评估)。

我的问题是:

如果代码是C#,我总是会得到ObjectReferenceNotSet等异常,因为obj的值是零和第二个表达式始终计算(不考虑运营商的) ,这意味着C#中的结果与Java中的结果不同。 如果我想改变C#代码正常工作,我必须创建两个if语句。

在C#中有没有更简单的方法来做到这一点类似于Java? (如果带有2个表达式,请将它保留为一个)

谢谢。

+1

我不得不downvote你,对不起:(但你的问题是完全错误的,我不明白为什么它接收多个选票! – fearofawhackplanet 2010-11-29 13:15:06

+1

我同意。我的其他位置搞错了。我要投票关闭这个问题。因为我无法删除它。 – Koekiebox 2010-11-29 13:22:39

+0

你有没有测试过这个? – Pedro 2010-11-29 14:03:50

回答

15

C#中的||运算符是短路的,就像在Java中一样。至于&&|&运营商是而不是短路,就像在Java中。

如果您的结果不同,代码中存在一个错误。你能告诉我们违规的C#吗?

这工作得很好:

object obj = null; 

    if(obj == null || string.IsNullOrEmpty(obj.ToString())) { 
     Console.WriteLine("Object is null"); 
    } 
0

这就是所谓的 “短路评价”。没有必要评估下一个陈述。这在Java中是一个很好的功能。

1

此行为是严格java language feature

在运行时,左 - 手操作数 首先评估表达式; [...]如果结果值为 ,则表示条件或 表达式的值为真,并且不评估右侧的 操作数表达式。 如果左侧操作数 的值为false,则会评估右侧的 表达式; 结果值成为条件或表达式的值 。

因此,计算与|相同的结果布尔或布尔操作数上的 。它 不同之处仅在于:在右侧 操作数表达式求值 有条件地而不是总是

类似的规则被用于java conditional-and operator定义。

比较(相同)C#:

&&||运算符称为 条件逻辑运算符。 它们也被称为 “短路”逻辑运算符。

条件和 - 表达

  • 包含性的或者表达
  • 条件和 - 表达& &包含性的或者表达

条件 - 或 - 表达式:

  • 条件和 - 表达
  • 有条件或表达||条件和 - 表达

&&||运营商是有条件的版本的&|运营商的 :

  • 操作x && y对应于 操作x & y,不同之处在于y是 进行评价只有在x不是false
  • 操作x || y对应于 操作x | y,不同之处在于y是 评价仅当x是不正确的。