使用string.IsNullOrEmpty(string)
檢查被認爲是不好的練習的字符串時,在.NET 4.0和更高版本中有string.IsNullOrWhiteSpace(string)
?string.IsNullOrEmpty(字符串)與string.IsNullOrWhiteSpace(字符串)
回答
最好的做法是選擇最合適的一個。
框架4.0 Beta 2中有 串新IsNullOrWhiteSpace()方法推廣了IsNullOrEmpty()方法,還包括除空字符串等白色 空間。
術語「空白」包括在 屏幕上不可見的所有字符。例如,空格,換行符,製表符和空字符串都是白色的 空格字符*。
參考:Here
出於性能,IsNullOrWhiteSpace並不理想,但 好。方法調用會導致性能下降。 此外,如果您不使用Unicode數據,則IsWhiteSpace方法本身具有一些間接關係,可以刪除 。一如既往,優化可能會過早,但它也很有趣。
參考:Here
檢查源代碼(參考源的.NET Framework 4.6.2)
[Pure]
public static bool IsNullOrEmpty(String value) {
return (value == null || value.Length == 0);
}
[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
它們是不同的功能。你應該爲你的情況決定你需要什麼。
我不認爲使用它們中的任何一個都是不好的做法。大部分時間IsNullOrEmpty()
就足夠了。但你有選擇:)
這個對包羅萬象的什麼......
if (string.IsNullOrEmpty(x.Trim())
{
}
這將削減所有的空間,如果他們有避免IsWhiteSpace的性能損失,這將使如果字符串不爲空,則符合「空」條件的字符串。
我也認爲這是更清楚,它總的來說很好的修剪字符串,尤其是如果你把它們放入數據庫或其他東西。
下面是實際執行的兩種方法(反編譯使用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;
}
所以這意味着'IsNullOrWhiteSpace'對'string.Empty'也是true!這是一個獎勵:) –
yes,Safest將會使用IsNullOrWhiteSpace(True爲String.empty,null和空白) – dekdev
在實踐中的差異:
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
這應該是我認爲的接受答案。比顯示實際示例而不是重定向更接受答案。 – eaglei22
檢查了這一點與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慢得多:/
這很明顯,因爲IsNullOrEmpty發生在常量時間O(1),而IsNullOrwhiteSpace可能需要對字符串或O(n)時間進行完整迭代。那麼你的定時例子實際上是使用近O(n^2)時間。對於具有正常大小字符串的單定時器,性能差異將可以忽略不計。如果您正在處理大量文本或在大循環中調用它,那麼您可能不想使用它。 –
- 1. 字符串與字節字符串
- 2. 字符串替換與字符串
- 3. 與字符串比較字符串值
- 4. 字符串與精度字符串
- 5. 與字符串
- 6. 與字符串
- 7. 與字符串
- 8. C字符串字符串
- 9. C++字符串!=字符串
- 10. 字符串字符串
- 11. Java字符串[]字符串[]
- 12. 字符串到字符串
- 13. java中字符串替換字符串與字符
- 14. 字符串與另一個字符串字符的比較
- 15. 保存含有<>字符與字符串的字符串
- 16. 字符串SomeLongString = JavaAPIMethodFor(字符串[]字符串,字符串分隔符)
- 17. 與字符串的子串()
- 18. 串聯__MODULE__與字符串
- 19. 字符串與符號
- 20. 與字符串值
- 21. C#字符串與[@]
- 22. PowerShell與字符串
- 23. 與Spilitted字符串
- 24. 字符串與Python
- 25. 字符串與環
- 26. readableObjectMode與字符串
- 27. http.get與字符串
- 28. 與字符串字面
- 29. C++與字符串文字
- 30. 字符串與非字母
現在我感到困惑:「IsNullOrWhiteSpace是一種方便的方法,它類似於下面的代碼,只是它提供了優越的性能」:http://msdn.microsoft.com/en-us/library/system.string .isnullorwhitespace(v = vs.110).aspx – robasta
@rob有問題的代碼是'return String.IsNullOrEmpty(value)|| value.Trim()。Length == 0;',它涉及新的字符串分配和兩個單獨的檢查。最有可能的是在IsNullOrWhitespace中,通過檢查字符串中的每個字符是否爲空白,通過單次傳遞完成而沒有任何分配,因此性能優越。什麼讓你困惑? –
謝謝!我從來不知道是否'''IsNullOrWhitespace()'''會匹配一個空字符串。本質上'''IsNullOrEmpty()''與IsNullOrWhitespace()'''的一個子集匹配。 – gligoran