2011-08-07 105 views

回答

272

最好的做法是選擇最合適的一個。

框架4.0 Beta 2中有 串新IsNullOrWhiteSpace()方法推廣了IsNullOrEmpty()方法,還包括除空字符串等白色 空間。

術語「空白」包括在 屏幕上不可見的所有字符。例如,空格,換行符,製表符和空字符串都是白色的 空格字符*

參考:Here

出於性能,IsNullOrWhiteSpace並不理想,但 好。方法調用會導致性能下降。 此外,如果您不使用Unicode數據,則IsWhiteSpace方法本身具有一些間接關係,可以刪除 。一如既往,優化可能會過早,但它也很有趣。

參考:Here

檢查源代碼(參考源的.NET Framework 4.6.2)

IsNullorEmpty

[Pure] 
public static bool IsNullOrEmpty(String value) { 
    return (value == null || value.Length == 0); 
} 

IsNullOrWhiteSpace

[Pure] 
public static bool IsNullOrWhiteSpace(String value) { 
    if (value == null) return true; 

    for(int i = 0; i < value.Length; i++) { 
     if(!Char.IsWhiteSpace(value[i])) return false; 
    } 

    return true; 
} 

例子

string nullString = null; 
string emptyString = ""; 
string whitespaceString = " "; 
string nonEmptyString = "abc123"; 

bool result; 

result = String.IsNullOrEmpty(nullString);   // true 
result = String.IsNullOrEmpty(emptyString);   // true 
result = String.IsNullOrEmpty(whitespaceString);  // false 
result = String.IsNullOrEmpty(nonEmptyString);  // false 

result = String.IsNullOrWhiteSpace(nullString);  // true 
result = String.IsNullOrWhiteSpace(emptyString);  // true 
result = String.IsNullOrWhiteSpace(whitespaceString); // true 
result = String.IsNullOrWhiteSpace(nonEmptyString); // false 
+0

現在我感到困惑:「IsNullOrWhiteSpace是一種方便的方法,它類似於下面的代碼,只是它提供了優越的性能」:http://msdn.microsoft.com/en-us/library/system.string .isnullorwhitespace(v = vs.110).aspx – robasta

+0

@rob有問題的代碼是'return String.IsNullOrEmpty(value)|| value.Trim()。Length == 0;',它涉及新的字符串分配和兩個單獨的檢查。最有可能的是在IsNullOrWhitespace中,通過檢查字符串中的每個字符是否爲空白,通過單次傳遞完成而沒有任何分配,因此性能優越。什麼讓你困惑? –

+4

謝謝!我從來不知道是否'''IsNullOrWhitespace()'''會匹配一個空字符串。本質上'''IsNullOrEmpty()''與IsNullOrWhitespace()'''的一個子集匹配。 – gligoran

34

它們是不同的功能。你應該爲你的情況決定你需要什麼。

我不認爲使用它們中的任何一個都是不好的做法。大部分時間IsNullOrEmpty()就足夠了。但你有選擇:)

+2

例如,一個註冊頁面上的用戶名字段將使用IsNullOrEmtpy驗證所以用戶不能有空格作爲他們的名字。 – Chris

+12

@Rfvgyhn:如果你想檢查用戶名沒有空格_anywhere_ - 你應該使用'Contains'。如果你想確保用戶名不能包含空格_only_ - IsNullOrWhiteSpace沒問題。 'IsNullOrEmpty'確保只有用戶名以某種方式被輸入。 –

+1

確實。我只是想給一個具體的例子來添加你的答案。在現實世界中,用戶名驗證規則通常會包含更多的邏輯,而不僅僅是檢查其空或空白。 – Chris

3

這個對包羅萬象的什麼......

if (string.IsNullOrEmpty(x.Trim()) 
{ 
} 

這將削減所有的空間,如果他們有避免IsWhiteSpace的性能損失,這將使如果字符串不爲空,則符合「空」條件的字符串。

我也認爲這是更清楚,它總的來說很好的修剪字符串,尤其是如果你把它們放入數據庫或其他東西。

+27

這種檢查有一個嚴重的缺點。在x上調用Trim()時,如果它作爲null傳遞,將導致一個空引用異常。 –

+9

好點。如果答案不正確以顯示缺點。 – Remotec

+1

IsNullOrWhitespace可以優化來檢查null或空,避免檢查字符串的空格。該方法將始終執行修剪操作。另外,雖然它可能會被優化掉,但它可能會在內存中創建另一個字符串。 – Sprague

26

下面是實際執行的兩種方法(反編譯使用dotPeek)

[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")] 
    public static bool IsNullOrEmpty(string value) 
    { 
     if (value != null) 
     return value.Length == 0; 
     else 
     return true; 
    } 

    /// <summary> 
    /// Indicates whether a specified string is null, empty, or consists only of white-space characters. 
    /// </summary> 
    /// 
    /// <returns> 
    /// true if the <paramref name="value"/> parameter is null or <see cref="F:System.String.Empty"/>, or if <paramref name="value"/> consists exclusively of white-space characters. 
    /// </returns> 
    /// <param name="value">The string to test.</param> 
    public static bool IsNullOrWhiteSpace(string value) 
    { 
     if (value == null) 
     return true; 
     for (int index = 0; index < value.Length; ++index) 
     { 
     if (!char.IsWhiteSpace(value[index])) 
      return false; 
     } 
     return true; 
    } 
+4

所以這意味着'IsNullOrWhiteSpace'對'string.Empty'也是true!這是一個獎勵:) –

+4

yes,Safest將會使用IsNullOrWhiteSpace(True爲String.empty,null和空白) – dekdev

139

在實踐中的差異:

string testString = ""; 
Console.WriteLine(string.Format("IsNullOrEmpty : {0}", string.IsNullOrEmpty(testString))); 
Console.WriteLine(string.Format("IsNullOrWhiteSpace : {0}", string.IsNullOrWhiteSpace(testString))); 
Console.ReadKey(); 

Result : 
IsNullOrEmpty : True 
IsNullOrWhiteSpace : True 

************************************************************** 
string testString = " MDS "; 

IsNullOrEmpty : False 
IsNullOrWhiteSpace : False 

************************************************************** 
string testString = " "; 

IsNullOrEmpty : False 
IsNullOrWhiteSpace : True 

************************************************************** 
string testString = string.Empty; 

IsNullOrEmpty : True 
IsNullOrWhiteSpace : True 

************************************************************** 
string testString = null; 

IsNullOrEmpty : True 
IsNullOrWhiteSpace : True 
+2

這應該是我認爲的接受答案。比顯示實際示例而不是重定向更接受答案。 – eaglei22

6

它說,這一切IsNullOrEmpty()不包含白色的間距,同時IsNullOrWhiteSpace()呢!

IsNullOrEmpty()如果字符串是:
-null
-empty

IsNullOrWhiteSpace()如果字符串是:
-null
-empty
- 包含白色空間只有

+2

我低估了,因爲當你解釋每個函數的功能時,你不回答實際問題。 – tuespetre

+0

您應該編輯您的答案以包含「框架」定義的「空白區域」的整個列表:術語「空白區域」包括屏幕上不可見的所有字符。例如,空格,換行符,製表符和空字符串都是空白字符。 – georger

2

檢查了這一點與IsNullOrEmpty和IsNullOrwhiteSpace

string sTestes = "I like sweat peaches"; 
    Stopwatch stopWatch = new Stopwatch(); 
    stopWatch.Start(); 
    for (int i = 0; i < 5000000; i++) 
    { 
     for (int z = 0; z < 500; z++) 
     { 
      var x = string.IsNullOrEmpty(sTestes);// OR string.IsNullOrWhiteSpace 
     } 
    } 

    stopWatch.Stop(); 
    // Get the elapsed time as a TimeSpan value. 
    TimeSpan ts = stopWatch.Elapsed; 
    // Format and display the TimeSpan value. 
    string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", 
     ts.Hours, ts.Minutes, ts.Seconds, 
     ts.Milliseconds/10); 
    Console.WriteLine("RunTime " + elapsedTime); 
    Console.ReadLine(); 

你會看到IsNullOrWhiteSpace慢得多:/

+1

這很明顯,因爲IsNullOrEmpty發生在常量時間O(1),而IsNullOrwhiteSpace可能需要對字符串或O(n)時間進行完整迭代。那麼你的定時例子實際上是使用近O(n^2)時間。對於具有正常大小字符串的單定時器,性能差異將可以忽略不計。如果您正在處理大量文本或在大循環中調用它,那麼您可能不想使用它。 –