2010-11-29 89 views
-3

我一直在Java(Mainly)和.Net中編寫代碼。||(或)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的值是零和第二個表達式始終計算(不考慮運營商的) ,這意味着C#中的結果與Java中的結果不同。 如果我想改變C#代碼正常工作,我必須創建兩個if語句。

在C#中有沒有更簡單的方法來做到這一點類似於Java? (如果帶有2個表達式,請將它保留爲一個)

謝謝。

+1

我不得不downvote你,對不起:(但你的問題是完全錯誤的,我不明白爲什麼它接收多個選票! – fearofawhackplanet 2010-11-29 13:15:06

+1

我同意。我的其他位置搞錯了。我要投票關閉這個問題。因爲我無法刪除它。 – Koekiebox 2010-11-29 13:22:39

+0

你有沒有測試過這個? – Pedro 2010-11-29 14:03:50

回答

15

C#中的||運算符是短路的,就像在Java中一樣。至於&&|&運營商是而不是短路,就像在Java中。

如果您的結果不同,代碼中存在一個錯誤。你能告訴我們違規的C#嗎?

這工作得很好:

object obj = null; 

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

這就是所謂的 「短路評價」。沒有必要評估下一個陳述。這在Java中是一個很好的功能。

1

此行爲是嚴格java language feature

在運行時,左 - 手操作數 首先評估表達式; [...]如果結果值爲 ,則表示條件或 表達式的值爲真,並且不評估右側的 操作數表達式。 如果左側操作數 的值爲false,則會評估右側的 表達式; 結果值成爲條件或表達式的值 。

因此,計算與|相同的結果布爾或布爾操作數上的 。它 不同之處僅在於:在右側 操作數表達式求值 有條件地而不是總是

類似的規則被用於java conditional-and operator定義。

比較(相同)C#:

&&||運算符稱爲 條件邏輯運算符。 它們也被稱爲 「短路」邏輯運算符。

條件和 - 表達

  • 包含性的或者表達
  • 條件和 - 表達& &包含性的或者表達

條件 - 或 - 表達式:

  • 條件和 - 表達
  • 有條件或表達||條件和 - 表達

&&||運營商是有條件的版本的&|運營商的 :

  • 操作x && y對應於 操作x & y,不同之處在於y是 進行評價只有在x不是false
  • 操作x || y對應於 操作x | y,不同之處在於y是 評價僅當x是不正確的。