2010-06-17 173 views
6

我希望這之前沒有問過。嵌套的if語句

我有一個名爲boolIsAllowed可空布爾和條件,如果像這樣:

if(boolIsAllowed.HasValue && boolIsAllowed.Value) 
{ 
//do something 
} 

我的問題是很好的代碼或我會更好,其分離成一個嵌套的if語句?如果boolIsAllowed.HasValue等於false然後拋出一個異常,第二個條件是否會被檢查?

我希望這個問題不是太愚蠢。

在此先感謝。

+2

作爲我的回答狀態 - 並沒有其他人所指出的那樣 - 爲空的布爾值,你可以使用GetValueOrDefault(假),這樣就避免了在兩個測試你的代碼無論如何 – 2010-06-17 10:32:30

回答

18

沒關係原樣。如果HasValue爲假,則檢查第二個條件將不檢查,所以它不會拋出異常。這就像這樣的事情:

string name = ...; 
if (name != null && name.Length > 5) 

再次,這很好 - 你不會得到一個NullReferenceException如果name是空的,因爲& &是短路

同樣,運算符是短路的,但是相反 - 如果左邊的操作數是true,則整個表達式的計算結果爲true,而不檢查右邊的操作數。例如:

// Treat null as if it were an empty string 
if (name == null || name.Length == 0) 

編輯:正如在評論中指出,這僅適用於& &和|| - 它適用於&和|,它總是評估兩個操作數。

+1

OMG - Jon Skeet回答了我的問題,並說我的代碼很好......這一天是史詩! :)非常認真,謝謝。 – 2010-06-17 09:47:09

+1

你知道嗎,他看起來無所不知,實際上不是神嗎? – 2010-06-17 10:00:11

+2

BLASPHEMY! * SCNR * – Bobby 2010-06-17 10:07:02

0

你可以這樣做:

if(boolIsAllowed.GetValueOrDefault(false)) 
{ 

} 

但是你原來的代碼不會拋出異常,因爲如果第一個測試失敗,那麼整個測試鋪位,因爲& &是「也」,所以如果第一次測試是錯誤的,測試無法成功。

6

什麼:

if (boolIsAllowed ?? false) 
{ 
} 
0

如果第一個操作數的計算結果爲真,第二個操作數只計算了。沒有必要嵌套if陳述。

8

您可以檢查真正的價值,即使它是空:

bool? val = null; 
if(val == true) // Works 
{ 
    //do something 
} 
+0

好的一個,但一個應該確保瞭解[詳細](http://stackoverflow.com/questions/447408/why-do-nullable-bools-not-allow-ifnullable-but-do-allow- ifnullable真)。 – 2010-06-17 10:28:20

0

你很安全。 C#短路布爾表達式,這就是爲什麼:

如果(!列表= NULL & & list.Count> 0)

作品。代碼不會費勁地試圖評估第二個條件,因爲它知道它不可能是真的,因爲第一個結果是錯誤的。

並非所有的語言都這樣做,很多都是。在VB中。你必須使用OrElse和AndAlso明確地完成它。

1

更一般地說,如果您在if語句中有多個條件,請考慮將它們提取到方法中。在這個具體的例子中,這並不是真正必要的,因爲其他一些答案已經證明。但在更復雜的情況下,它可以更簡單。你是否願意維護:

if (taxApplied && taxValue > minimumTax && customerIsPreferred) 
{ 
    // Do something 
} 

if (CustomerGetsTaxRebate()) 
{ 
    // Do Something 
}