-3

私はしばらくの間Java(主に)と.Netでコーディングしてきました。

私が見つけたのは||、.Netの論理演算子は、結果として||Javaの演算子とは異なるということです。

次のJavaコードを見てみましょう。

Object obj = null;

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

上記のコードの結果は次のようになります。

オブジェクトがnullです

その理由はobj == nulltrue2番目の式が評価されなかったためです。もしそうなら、私はを受け取ったでしょうjava.lang.NullPointerException

また、シングルまたは()を使用した場合は、 (両方が評価されます)|も受け取ります。NullPointerException

私の質問は次のとおりです。

コードがC#の場合、obj値がnullであり、2番目の式が常に評価されるため(演算子に関係なく)、常にObjectReferenceNotSetなどの例外が発生します。つまり、C#とJavaでは結果が異なります。正しく機能するようにC#コードを変更する場合は、2つのifステートメントを作成する必要があります。

これをC#でJavaに似せる簡単な方法はありませんか?(2つの式がある場合は1つにまとめてください)

ありがとうございました。

4

4 に答える 4

15

C#の||演算子は、Javaの場合と同様に、短絡しています。そのまま&&|and&演算子は、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言語機能です

実行時に、左側のオペランド式が最初に評価されます; [...]結果の値がtrueの場合、条件式または式の値はtrueであり、右側のオペランド式は評価されません。左側のオペランドの値がfalseの場合、右側の式が評価されます。[...]結果の値は、条件式または式の値になります。

したがって、|| |と同じ結果を計算します ブールまたはブールオペランド。右辺のオペランド式が常にではなく条件付きで評価される点のみが異なります

同様のルールがjava条件付き演算子と演算子に対して定義されています。

(同一)をC#と比較します:

&&and||演算子は、条件付き論理演算子と呼ばれます。これらは「短絡」論理演算子とも呼ばれます。

条件付き式

  • 包括的または表現
  • 条件付きおよび式&&包括的または式

条件付きまたは式:

  • 条件付き式
  • 条件付きまたは式|| 条件付き式

&&and演算子は、and演算子||の条件付きバージョンです。&|

  • 操作は操作x && yに対応しますがx & y、そうでないy場合にのみ評価されます。xfalse
  • 演算は、真でない場合にのみ評価されることを除いてx || y、演算に対応します。x | yyx
于 2010-11-29T13:16:00.940 に答える
0

これは「短絡評価」と呼ばれます。次のステートメントを評価する必要はありません。これはJavaの優れた機能です。

于 2010-11-29T13:07:02.717 に答える