2009-10-23 10 views
3

我不斷地發現自己寫類似的代碼,如下面的例子:增加一倍。如果在C#否則問題

if (object["Object Name"] != null) { 
    if (object["Object Name"] == "Some Value") { 
     // Do Statement A 
    } else { 
     // Do Statement B 
    } 
} else { 
    // Do Statement B 
} 

這裏的問題是,我還是檢查對象爲空或不是,然後我可以再覈實這是實際的內容。

「語句B」總是相同的,在我的情況下通常是SQL語句。

一定有更好的解決辦法嗎?

感謝
斯蒂芬

回答

23

還有就是在C#中短路,所以你可以這樣做:

if(null != object && object.name == foo) 
    do A 
else 
    do B 

C#總是首先評估在條件語句中第一個表達式,如果失敗,它不在聲明的這一部分嘗試其他任何內容。

爲了進一步說明這一點,如果您要在條件語句中進行昂貴的操作以及一個或多個廉價操作,那麼最好儘可能將其放在最後,以便僅在檢查時才檢查昂貴的操作它確實需要。所以像

if(trivial comparison && trivial comparison && REALLY EXPENSIVE OPERATION) 

它現在只會執行昂貴的操作作爲最後的手段。

+1

如果對象爲null,則語句評估false,甚至不檢查object.name。 – badbod99 2009-10-23 11:40:42

+0

是的,我想這也是真的。 – kemiller2002 2009-10-23 11:45:06

+0

謝謝!我不認爲這是可能的,但這顯然是我寫if語句的方式。 Thx :) – GateKiller 2009-10-23 11:50:04

1

由於C#確實短路,是的。試試這個:

if (object["Object Name"] != null && object["Object Name"] == "Some Value") 
{ 
    // Do Statement A 
} 
else 
{ 
    // Do Statement B 
} 
1

我認爲重寫if-then-else到這將使它看起來更好,因爲單個B語句。

if ((object["Object Name"] != null) && (object["Object Name"] == "Some Value")) 
{ 
    // Do Statement A 
} 
else 
{ 
    // Do Statement B 
} 
1

爲什麼要仔細檢查?毫無疑問,這將是足夠的:

if(object["Object Name"] == "Some Value") { 
    // Do statement A 
} else { 
    // Do statement B 
} 

我有點明白你在與空檢查得到什麼,而是你給特定的示例並不需要它。

編輯:現在,如果你寫了這代替

if (object != null) { 
    if (object["Object Name"] == "Some Value") { 
     // Do Statement A 
    } else { 
     // Do Statement B 
    } 
} else { 
    // Do Statement B 
} 

那麼解決辦法是:

if(object != null && object["Object Name"] == "Some Value") { 
    // Do Statement A 
} else { 
    // Do Statement B 
} 
+0

如果對象不包含項目「對象名稱」,則會拋出空的異常。 – GateKiller 2009-10-23 11:51:44

+2

如果是這種情況,那麼測試'object [「Object Name」] == null'也會拋出異常。 – 2009-10-23 11:58:42

0

免責聲明:如果不這樣做一般的短路法。

那麼,你可以創建一個單獨的函數來執行查找,特別是如果查詢保持不變。所以像這樣:(僞代碼進來)

private bool IsNullCheck(string objectName) 
{ 
    if (object["Object Name"] != null) 
    return false; 
    else 
    // statement B 
} 

if (!IsNullCheck("Object Name") && if(object["Object name"] == "Value") { 
    // stuffs 

} 
else 
{ 
     // Do Statement B 
} 

或類似的東西。

+2

如果你問我,那真的會破壞可讀性和易維護性...... – 2009-10-23 11:46:08

+0

如果一遍又一遍地重複使用,這是我的觀點。可維護性應該急劇增加,因爲您只能在一個地方更改代碼,而不是50。 – 2009-10-23 12:32:01