-3

我一直在用 Java(主要)和 .Net 编码一段时间。

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

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

Object obj = null;

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

上面代码的结果将是:

对象为空

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

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

我的问题如下:

如果代码是 C#,我将始终得到 ObjectReferenceNotSet 等异常,因为 obj 值为 null 并且始终评估第二个表达式(无论运算符如何),这意味着 C# 中的结果与 Java 中的结果不同。如果我想更改 C# 代码以使其正常工作,我必须创建两个 if 语句。

有没有更简单的方法可以在 C# 中做到这一点以类似于 Java?(如果有 2 个表达式,将其保持在一个中)

谢谢你。

4

4 回答 4

15

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

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

这工作正常:

    object obj = null;

    if(obj == null || string.IsNullOrEmpty(obj.ToString())) {
        Console.WriteLine("Object is null");
    }
于 2010-11-29T13:06:03.947 回答
2

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

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

于 2010-11-29T13:08:41.040 回答
1

这种行为是严格的java 语言特性

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

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

为java 条件与运算符定义了类似的规则。

与 C# 比较(相同):

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

条件表达式

  • 包含或表达
  • 条件和表达式 && 包含或表达式

条件或表达式:

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

&&and运算符是and运算符的||条件版本:&|

  • 操作x && y对应于操作x & y,除了仅在is noty时才评估。xfalse
  • operationx || y对应于 operation x | y,除了只有在不为真y时才被评估。x
于 2010-11-29T13:16:00.940 回答
0

它被称为“短路评估”。无需评估下一条语句。这是 Java 中一个不错的功能。

于 2010-11-29T13:07:02.717 回答