2009-12-12 74 views
4

我在看一段代碼我在C#中寫道:的毗連字符串中IsNullOrEmpty參數

if(string.IsNullOrEmpty(param1) && string.IsNullOrEmpty(param2) && string.IsNullOrEmpty(param3)) 
{ 
     // do stuff 
} 

,並決定將使其更具可讀性/簡潔

if(string.IsNullOrEmpty(param1+param2+param3)) 
{ 
     // do stuff 
} 

但是看着它,我可以沒有幫助,只是畏縮。你對此有何看法?你有沒有做過這樣的事情,你是否在適用的時候使用它。

注意:此行之前的代碼將通過添加特定項來操作集合,具體取決於param(param1,param2,param3)是否爲空。這個if語句是爲了驗證/錯誤處理。

回答

5

我個人比較喜歡前者。對我來說,意圖更明確 - 檢查所有參數是否爲空/空。

第二個也隱藏了它處理空值的事實。空字符串是奇數。例如,上面的傑森威廉姆斯並沒有實際上確實工作。

+0

中的第一個示例一樣,我也驚訝連接空字符串引用沒有拋出。 – 2009-12-12 07:37:18

+0

+1(我認爲這是一個詞) - 第二個示例 – 2009-12-12 07:48:17

+0

+1中的代碼不易理解,用於正確驗證。在第二個例子中,即使**一些**(不是全部)字符串爲空或空白,驗證也會通過。這會改變行爲。主要目的是驗證,正如Buddie明確寫到的那樣。因此後面的例子引入了一個錯誤。 – 2009-12-12 08:08:23

0

原始代碼儘管時間更長,但其意圖更清晰,並且可能具有類似的性能。我會放棄它。

1

如果你能得到一個集合中的PARAMS(這如果是功能,您可以用params關鍵字),那麼這可能會奏效:

if (myParams.Any(IsNullOrTrimEmpty) 
    { 
     // do stuff 
    } 

的例子使用this string extensionmyParamsstring[]

+2

你可以只對myParams.Any(String.IsNullOrEmpty) – ICR 2009-12-12 07:32:21

+0

@ICR:你能詳細解釋一下嗎? – 2009-12-12 07:35:33

+0

@ ICR-我認爲他的意思是p.IsNullOrTrimEmpty()來自該擴展方法,而不是.Any() – Omar 2009-12-12 07:37:46

2

這是行不通的。如果任何字符串爲空,您將得到一個空解除引用異常。你需要在使用它們之前檢查它們。

此外,這是非常低效的。您將所有字符串連接成一個新字符串,然後測試它是否爲非空。這會導致一個或多個內存分配,並且可能會複製大量數據,只會立即丟棄並稍後收集垃圾。

更好的方法是編寫一個方法,它接受可變參數或字符串列表,並在循環中使用IsNullOrEmpty逐個檢查它們。這將會更加高效,安全,但仍然可以在您的if語句中實現整齊代碼的預期結果。

+4

連接空字符串不會導致NullReferenceException。只有取消引用它們。 – 2009-12-12 07:31:09

+2

同意邁克爾。是的,這將是低效的 - 但它不會拋出。 – 2009-12-12 07:32:05

+1

我很高興回答 - 當我學到新的東西時,我喜歡它:-)現在有什麼機會可以停止低估我?這仍然是低效的。 – 2009-12-12 07:36:31

4

也許把它寫這樣的事情,這是一個比較可讀:

bool paramsAreInvalid = 
    string.IsNullOrEmpty(param1) 
    && string.IsNullOrEmpty(param2) 
    && string.IsNullOrEmpty(param3); 

if (paramsAreInvalid) 
{ 
     // do stuff 
} 
3

這是一件小事,但我認爲在提高可讀性原始結果的一個簡單的重新格式化,使代碼的意圖大約爲清澈如可以是:

if (string.IsNullOrEmpty(param1) && 
    string.IsNullOrEmpty(param2) && 
    string.IsNullOrEmpty(param3)) 
{ 
     // do stuff 
} 

考慮此組類似的例子:

if (c == 's' || c == 'o' || c == 'm' || c == 'e' || c == 't' || c == 'h' || c == 'i' || c == 'n' || c == 'g') { 
    // ... 
} 

if (c == 's' || 
    c == 'o' || 
    c == 'm' || 
    c == 'e' || 
    c == 't' || 
    c == 'h' || 
    c == 'i' || 
    c == 'n' || 
    c == 'g') { 
    // ... 
}