||(或)Java与.Net中的逻辑运算符

时间:2010-11-29 13:04:20

标签: c# java .net logical-operators

我已经用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值为null并且始终评估第二个表达式(无论运算符如何),意味着结果不同C#比Java。 如果我想更改C#代码以使其正常工作,我必须创建两个if语句。

在C#中有没有更简单的方法与Java类似? (如果有2个表达式,请将其保留为一个)

谢谢。

4 个答案:

答案 0 :(得分:15)

C#中的||运算符是短路的,就像在Java中一样。与&&一样。 |&运算符短路,就像在Java中一样。

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

这很好用:

    object obj = null;

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

答案 1 :(得分:2)

||运算符在Java和C#中具有完全相同的含义。它被称为条件逻辑OR ,或“短路”逻辑OR 运算符:

http://msdn.microsoft.com/en-us/library/6373h346%28VS.71%29.aspx

答案 2 :(得分:1)

此行为是严格的java language feature

  

在运行时,左侧操作数   表达式首先被评估; [...]如果结果值是   是的,条件的值或   表达是真实的,也是右手   不评估操作数表达式。   如果是左侧操作数的值   是假的,然后是右手   表达式被评估; [...]   结果值变为值   条件或表达式。

     

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

java conditional-and operator定义了类似的规则。

比较(相同)C#:

  

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

     

条件和 - 表达

     
      
  • 性的或表达
  •   
  • 条件和表达&&包括性的或表达
  •   
     

有条件或表达:

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

&&||运算符是条件版本   &|运营商:

     
      
  • 操作x && y对应于   操作x & y,但y除外   仅在x不是false的情况下进行评估。
  •   
  • 操作x || y对应   操作x | yy除外   仅在x不成立时进行评估。
  •   

答案 3 :(得分:0)

它被称为“短路评估”。没有必要评估下一个陈述。这是Java中的一个很好的功能。