2012-11-21 112 views
0

我處理這類問題,所有的時間,並想知道,如果你有任何光滑優雅的變通:編程邏輯IF然後

if(myObject != null && myObject.myProperty != myValue){ 
//do something 
}else{ 
//do something else 
} 

如果我運行這個邏輯,我得到空引用時myObject的是空所以我最終這樣做:

if(myObject != null){ 
    if(myObject.myProperty != myValue){ 
     //do something 
    }else{ 
     //do something else 
    } 
}else{ 
    //do something else 
} 

所以我最終有冗餘的代碼在我的「做別的事情」你們如何處理這個?

+0

究竟是怎麼做別的東西在這裏不一樣? – raina77ow

+0

您的第一個代碼段有效 – emartel

+2

您確定在第一個代碼中有兩個符號?如果你只有一個,你會期望一個空引用。兩個應該防止這一點。 – sybkar

回答

2

null首先檢查意味着,如果不是第二個條件不會被評估遇到 - 當使用邏輯AND(&&) - 所以我建議你的空引用異常來自其他地方,而不是後者的條件。

+0

很好的解釋,我會選擇這個答案 – box86rowh

-2

你的第一個說法是完全有效的。

if(myObject != null && myObject.MyProperty != myValue) 

這將完成是將評估myObject != null第一,既然有一個&&到它的權利,如果是假的,它甚至不需要評估其他的條款。

如果只是複製和粘貼你在這裏粘貼代碼,我想你會發現它成功運行

+0

這正是他從什麼時候開始的...... –

+1

這也有語法錯誤。錯誤的情況下,如果'和'!-'沒有意義。 – vcsjones

2

沒有「優雅」的方式來解決這個問題 - 兩個共享「去做別的事情」的編碼方式是不同的非優雅度的真正:

  • 你可以把「做退出時從if聲明別的東西」的代碼放到一個函數,或
  • 進入if如果需要額外的處理意見之前定義的標記,並作用於標誌。

第一個解決方案是不言自明;第二種解決方案看起來像這樣:

var processed = false; 
if(myObject != null) { 
    if(myObject.myProperty != myValue){ 
     //do something 
     processed = true; 
    } 
    // do more stuff knowing that myObject is not null 
} 
if (!processed) { 
    // do something else 
} 
+0

++我不得不使用這個構造之前,我很高興得到確認,沒有什麼辦法。 – John

+0

但從我所看到的OP實際上並沒有說'問題'。 –