||(或)Java中的逻辑运算符与.Net
我一直在Java(Mainly)和.Net中编写代码。||(或)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的值是零和第二个表达式始终计算(不考虑运营商的) ,这意味着C#中的结果与Java中的结果不同。 如果我想改变C#代码正常工作,我必须创建两个if语句。
在C#中有没有更简单的方法来做到这一点类似于Java? (如果带有2个表达式,请将它保留为一个)
谢谢。
C#中的||
运算符是短路的,就像在Java中一样。至于&&
。 |
和&
运营商是而不是短路,就像在Java中。
如果您的结果不同,代码中存在一个错误。你能告诉我们违规的C#吗?
这工作得很好:
object obj = null;
if(obj == null || string.IsNullOrEmpty(obj.ToString())) {
Console.WriteLine("Object is null");
}
这就是所谓的 “短路评价”。没有必要评估下一个陈述。这在Java中是一个很好的功能。
该||运算符在Java和C#中具有完全相同的含义。它被称为条件逻辑OR,或“短路” 逻辑或操作:
http://msdn.microsoft.com/en-us/library/6373h346%28VS.71%29.aspx
此行为是严格java language feature:
在运行时,左 - 手操作数 首先评估表达式; [...]如果结果值为 ,则表示条件或 表达式的值为真,并且不评估右侧的 操作数表达式。 如果左侧操作数 的值为false,则会评估右侧的 表达式; 结果值成为条件或表达式的值 。
因此,计算与|相同的结果布尔或布尔操作数上的 。它 不同之处仅在于:在右侧 操作数表达式求值 有条件地而不是总是
类似的规则被用于java conditional-and operator定义。
比较(相同)C#:
的
&&
和||
运算符称为 条件逻辑运算符。 它们也被称为 “短路”逻辑运算符。条件和 - 表达:
- 包含性的或者表达
- 条件和 - 表达& &包含性的或者表达
条件 - 或 - 表达式:
- 条件和 - 表达
- 有条件或表达||条件和 - 表达
的
&&
和||
运营商是有条件的版本的&
和|
运营商的 :
- 操作
x && y
对应于 操作x & y
,不同之处在于y
是 进行评价只有在x
不是false
。- 操作
x || y
对应于 操作x | y
,不同之处在于y
是 评价仅当x
是不正确的。
我不得不downvote你,对不起:(但你的问题是完全错误的,我不明白为什么它接收多个选票! – fearofawhackplanet 2010-11-29 13:15:06
我同意。我的其他位置搞错了。我要投票关闭这个问题。因为我无法删除它。 – Koekiebox 2010-11-29 13:22:39
你有没有测试过这个? – Pedro 2010-11-29 14:03:50