我希望這之前沒有問過。嵌套的if語句
我有一個名爲boolIsAllowed可空布爾和條件,如果像這樣:
if(boolIsAllowed.HasValue && boolIsAllowed.Value)
{
//do something
}
我的問題是很好的代碼或我會更好,其分離成一個嵌套的if語句?如果boolIsAllowed.HasValue等於false然後拋出一個異常,第二個條件是否會被檢查?
我希望這個問題不是太愚蠢。
在此先感謝。
我希望這之前沒有問過。嵌套的if語句
我有一個名爲boolIsAllowed可空布爾和條件,如果像這樣:
if(boolIsAllowed.HasValue && boolIsAllowed.Value)
{
//do something
}
我的問題是很好的代碼或我會更好,其分離成一個嵌套的if語句?如果boolIsAllowed.HasValue等於false然後拋出一個異常,第二個條件是否會被檢查?
我希望這個問題不是太愚蠢。
在此先感謝。
沒關係原樣。如果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)
編輯:正如在評論中指出,這僅適用於& &和|| - 它不適用於&和|,它總是評估兩個操作數。
OMG - Jon Skeet回答了我的問題,並說我的代碼很好......這一天是史詩! :)非常認真,謝謝。 – 2010-06-17 09:47:09
你知道嗎,他看起來無所不知,實際上不是神嗎? – 2010-06-17 10:00:11
BLASPHEMY! * SCNR * – Bobby 2010-06-17 10:07:02
你可以這樣做:
if(boolIsAllowed.GetValueOrDefault(false))
{
}
但是你原來的代碼不會拋出異常,因爲如果第一個測試失敗,那麼整個測試鋪位,因爲& &是「也」,所以如果第一次測試是錯誤的,測試無法成功。
什麼:
if (boolIsAllowed ?? false)
{
}
如果第一個操作數的計算結果爲真,第二個操作數只計算了。沒有必要嵌套if
陳述。
您可以檢查真正的價值,即使它是空:
bool? val = null;
if(val == true) // Works
{
//do something
}
好的一個,但一個應該確保瞭解[詳細](http://stackoverflow.com/questions/447408/why-do-nullable-bools-not-allow-ifnullable-but-do-allow- ifnullable真)。 – 2010-06-17 10:28:20
你很安全。 C#短路布爾表達式,這就是爲什麼:
如果(!列表= NULL & & list.Count> 0)
作品。代碼不會費勁地試圖評估第二個條件,因爲它知道它不可能是真的,因爲第一個結果是錯誤的。
並非所有的語言都這樣做,很多都是。在VB中。你必須使用OrElse和AndAlso明確地完成它。
更一般地說,如果您在if語句中有多個條件,請考慮將它們提取到方法中。在這個具體的例子中,這並不是真正必要的,因爲其他一些答案已經證明。但在更復雜的情況下,它可以更簡單。你是否願意維護:
if (taxApplied && taxValue > minimumTax && customerIsPreferred)
{
// Do something
}
或
if (CustomerGetsTaxRebate())
{
// Do Something
}
作爲我的回答狀態 - 並沒有其他人所指出的那樣 - 爲空的布爾值,你可以使用GetValueOrDefault(假),這樣就避免了在兩個測試你的代碼無論如何 – 2010-06-17 10:32:30