我已经用Java(主要)和.Net编写了一段时间。
我发现.Net中的||
逻辑运算符与Java中的||
运算符的结果不同。
让我们看看以下Java代码:
Object obj = null;
if(obj == null || obj.toString().isEmpty()){
System.out.println("Object is null");
}
上面代码的结果将是:
对象为空
原因是因为obj == null
是true
而第二个表达式未被评估。如果是的话,我会收到java.lang.NullPointerException
。
如果我使用单曲或(|
),我也会收到NullPointerException
(两者都被评估)。
我的问题如下:
如果代码是C#,我将始终获得ObjectReferenceNotSet等异常,因为obj值为null并且始终评估第二个表达式(无论运算符如何),意味着结果不同C#比Java。 如果我想更改C#代码以使其正常工作,我必须创建两个if语句。
在C#中有没有更简单的方法与Java类似? (如果有2个表达式,请将其保留为一个)
谢谢。
答案 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 | y
,y
除外 仅在x
不成立时进行评估。
答案 3 :(得分:0)
它被称为“短路评估”。没有必要评估下一个陈述。这是Java中的一个很好的功能。