2013-03-01 66 views
5

據我瞭解和閱讀,你可以在if語句(& &或||)中使用短路,以使第二個條件不會觸發。如果你想讓兩個條件都被觸發,你可以使用單個操作數(&或|)。Inline If語句 - 短路

所以說,如果我有內嵌if語句如下:

var test = (MyObject != null || string.IsNullOrEmpty(MyObject.Property)) ? string.Empty : MyObject.Property; 

這將引發object reference錯誤,如果myObject的是空,這在我看來應該不是,因爲我用短路。有人可以解釋這一點。

+3

你」重新在'?'之前丟失了一個右括號。 – Corak 2013-03-01 12:01:04

+0

@科拉克是錯過了最後一個支架...現在編輯 – Zaki 2013-03-01 12:04:25

回答

13

您使用的是錯誤的條件。這一部分:

MyObject != null || string.IsNullOrEmpty(MyObject.Property) 

應該是:

MyObject == null || string.IsNullOrEmpty(MyObject.Property) 

||的RHS只有左手是執行。你希望它只能在MyObject而不是 null時執行。

編輯:如果你真的想MyObject != null一部分,你可以在整個事情改變爲:

var test = MyObject != null && !string.IsNullOrEmpty(MyObject.Property) 
     ? MyObject.Property : ""; 

注意條件運算符的第二和第三個操作數的逆轉也不過。

+0

啊我看到所以如果我這樣做&&爲相同的條件,而不是||它應該沒問題 – Zaki 2013-03-01 11:59:44

+0

@ Sam1:那麼你需要反轉其他一些位。 – 2013-03-01 12:00:21

+0

感謝現在很清楚:P – Zaki 2013-03-01 12:02:46

3

你應該有一個==不是=

var test = (MyObject == null || string.IsNullOrEmpty(MyObject.Property) ? string.Empty : MyObject.Property 
2

試試這個:

var test = (MyObject == null || string.IsNullOrEmpty(MyObject.Property) 
      ? string.Empty : MyObject.Property 
2
MyObject != null || string.IsNullOrEmpty(MyObject.Property) 

在這裏,您說。

如果我的對象不是null。 或 string.IsNullOrEmpty(MyObject.Property)

這意味着如果MyObject爲null,他會嘗試執行第二部分。

MyObject == null || string.IsNullOrEmpty(MyObject.Property) 

這不會引發空異常

2

這是因爲MyObjectnull,因此,第一個條件是false所以第二部分必須進行評估,以瞭解整個狀況。行改成這樣:

MyObject != null && string.IsNullOrEmpty(MyObject.Property) 
1

你應該更喜歡的可讀性,而不是行數,如:

string prop = string.Empty; 
if(MyObject != null && MyObject.Property != null) 
    prop = MyObject.Property; 

(你異常的原因在其他的答案中進行了說明)

+0

線數並不總是目標。例如,在一個Lamda /謂詞中,強制使用'{'&'}'並且顯式返回也是不可讀的。 – JoeBrockhaus 2014-04-22 22:40:08