Answers:
最佳做法是选择最合适的一种。
.Net Framework 4.0 Beta 2为字符串提供了一个新的IsNullOrWhiteSpace()方法,该方法将IsNullOrEmpty()方法推广为除了空字符串之外还包括其他空白。
术语“空白”包括屏幕上不可见的所有字符。例如,空格,换行符,制表符和空字符串是空格字符*。
参考:这里
对于性能而言,IsNullOrWhiteSpace并不理想,但很好。该方法调用将导致较小的性能损失。此外,如果您不使用Unicode数据,则IsWhiteSpace方法本身具有一些可以删除的间接寻址。与往常一样,过早的优化可能是邪恶的,但这也很有趣。
参考:这里
检查源代码(参考源.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
return String.IsNullOrEmpty(value) || value.Trim().Length == 0;
,其中涉及新的字符串分配和两个单独的检查。最有可能在IsNullOrWhitespace内部,通过检查字符串中的每个char是否为空格来单次通过而不进行任何分配,从而实现了出色的性能。到底是什么让您感到困惑?
IsNullOrWhitespace()
会匹配一个空字符串。本质上IsNullOrEmpty()
匹配的子集IsNullOrWhitespace()
。
实践上的差异:
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
它们是不同的功能。您应根据自己的情况决定需要什么。
我不认为将它们中的任何一个当作坏习惯。大多数时间IsNullOrEmpty()
就足够了。但是您可以选择:)
Contains
。如果要确保用户名不能仅包含空格- IsNullOrWhiteSpace
可以。IsNullOrEmpty
确保仅以某种方式输入用户名。
这是这两种方法的实际实现(使用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
!这是一个奖金:)
它说这一切IsNullOrEmpty()
都不包括空格IsNullOrWhiteSpace()
!
IsNullOrEmpty()
如果字符串是:
-null
-empty
IsNullOrWhiteSpace()
如果字符串是:
-null
-empty
-包含白色空间只有
使用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慢得多:/
那这一切呢...
if (string.IsNullOrEmpty(x.Trim())
{
}
如果存在空格,则会对所有空格进行修剪,以避免IsWhiteSpace的性能下降,这将使字符串在不为null的情况下满足“空”条件。
我也认为这很清楚,而且无论如何都要修剪字符串,这通常是个好习惯,尤其是当您将它们放入数据库或其他内容时。
在.Net标准2.0中:
string.IsNullOrEmpty()
:指示指定的字符串为null还是Empty字符串。
Console.WriteLine(string.IsNullOrEmpty(null)); // True
Console.WriteLine(string.IsNullOrEmpty("")); // True
Console.WriteLine(string.IsNullOrEmpty(" ")); // False
Console.WriteLine(string.IsNullOrEmpty(" ")); // False
string.IsNullOrWhiteSpace()
:指示指定的字符串是null,空还是仅由空格字符组成。
Console.WriteLine(string.IsNullOrWhiteSpace(null)); // True
Console.WriteLine(string.IsNullOrWhiteSpace("")); // True
Console.WriteLine(string.IsNullOrWhiteSpace(" ")); // True
Console.WriteLine(string.IsNullOrWhiteSpace(" ")); // True