我有下面的代碼,我的一個同事告訴我是不正確的,如果我的變量是空會崩潰:正確的方式,如果一個變量爲空或空
List<FSKUser> users = null;
if (users == null || users.Count() == 0)
{
return false;
}
顯然=null
僅僅是測試目的。但是,當我運行這個代碼它正確運行並返回false。
我正在檢查一種安全正確的檢查方式嗎?
我有下面的代碼,我的一個同事告訴我是不正確的,如果我的變量是空會崩潰:正確的方式,如果一個變量爲空或空
List<FSKUser> users = null;
if (users == null || users.Count() == 0)
{
return false;
}
顯然=null
僅僅是測試目的。但是,當我運行這個代碼它正確運行並返回false。
我正在檢查一種安全正確的檢查方式嗎?
是的,這是安全正確的方法。您的同事可能對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。在這種情況下,你們都有機會學習:)
我想說的話,他應該使用'.Count'財產(沒有括號)作爲好。用List <>來快速。 Linq擴展會發現這是一個'ICollection <>'並使用'Count'屬性。但是,如果你想要的LINQ,使用'。任何()'代替,因爲它是較短的,更精確的,並且可以更快當底層源是不** **一個'列表<>'。 –
你的代碼沒有問題。第二個條件將僅在用戶不等於null
時評估,因此這是檢查null的正確方法。
與其他語言(VB.NET以及相對於AndAlso
和OrElse
的And
和Or
運營商),C#只只要他們因此對整體結果的影響評估的條件。如果 - 和你的情況一樣 - 邏輯或操作的第一個條件已經評估爲真,則不需要檢查第二個條件。
你的朋友是錯的。 ||
運營商短路 - 第一次退出true
任何條款返回true
。同樣,&&
運營商第一次退出false
任何條款返回false
。因此,您的users.Count()
不能如果users
是null
(除非,也許,users
是一個領域,你正在做大量的線程,以及編譯器和JIT都選擇明確加載場兩次因某種原因)到達。
可能,這將是你的榜樣有用:
List<FSKUser> users = null;
return users != null && users.Any();
在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 –