2014-03-31 25 views
3

我有下面的代碼,我的一個同事告訴我是不正確的,如果我的變量是空會崩潰:正確的方式,如果一個變量爲空或空

List<FSKUser> users = null; 

if (users == null || users.Count() == 0) 
{ 
    return false; 
} 

顯然=null僅僅是測試目的。但是,當我運行這個代碼它正確運行並返回false。

我正在檢查一種安全正確的檢查方式嗎?

+0

在http://stackoverflow.com/questions/8582344/does-c-sharp-have-isnullorempty-for-list-看看IEnumerable和http://stackoverflow.com/questions/5047349/how-to-check-if-ienumerable-is-null-or-empty –

回答

6

是的,這是安全正確的方法。您的同事可能對C#中運算符優先級或布爾表達式評估有一些奇怪的理解:)

||運算符(與&&相同)只要能夠確定結果就會停止計算。由於一旦操作數中的一個操作數爲true,布爾OR不會產生false,所以或者在第一個操作數上失敗(如果它爲空,結果爲true =>你完成了),或者它將評估運營商。

當然,如果您不反對使用擴展方法,可以方便地使用它來簡化條件。例如。您可以使用擴展方法是這樣的:

public static bool IsEmpty<T>(List<T> @this) 
{ 
    return @this == null || @this.Count == 0; 
} 

然後,您可以使用這樣的條件:

if (users.IsEmpty()) 
{ 
    ... 
} 

另外,還要注意List<T>Count財產 - 你應該用這個來代替擴展方法Count()。最後,它會做同樣的事情IIRC(它檢查這個枚舉是一個集合還是一個列表,IIRC),但它通過一些循環來做到這一點。

你可能想問你的同事他認爲會發生什麼。你有一個簡單的測試用例,表明你是對的,但也許他有自己的一些原因,他爲什麼不想這樣做。然而,最有可能的事情是,他習慣了不同的編程語言,實際上並不是本地的C#-er。在這種情況下,你們都有機會學習:)

+1

我想說的話,他應該使用'.Count'財產(沒有括號)作爲好。用List <>來快速。 Linq擴展會發現這是一個'ICollection <>'並使用'Count'屬性。但是,如果你想要的LINQ,使用'。任何()'代替,因爲它是較短的,更精確的,並且可以更快當底層源是不** **一個'列表<>'。 –

0

你的代碼沒有問題。第二個條件將僅在用戶不等於null時評估,因此這是檢查null的正確方法。

與其他語言(VB.NET以及相對於AndAlsoOrElseAndOr運營商),C#只只要他們因此對整體結果的影響評估的條件。如果 - 和你的情況一樣 - 邏輯或操作的第一個條件已經評估爲真,則不需要檢查第二個條件。

0

你的朋友是錯的。 ||運營商短路 - 第一次退出true任何條款返回true。同樣,&&運營商第一次退出false任何條款返回false。因此,您的users.Count()不能如果usersnull(除非,也許,users是一個領域,你正在做大量的線程,以及編譯器和JIT都選擇明確加載場兩次因某種原因)到達。

0

可能,這將是你的榜樣有用:

List<FSKUser> users = null; 
return users != null && users.Any();