string.IsNullOrEmpty(string)与string.IsNullOrWhiteSpace(string)


207

string.IsNullOrEmpty(string)string.IsNullOrWhiteSpace(string)在.NET 4.0及更高版本中存在时,检查字符串时使用是否被视为不良做法?

Answers:


328

最佳做法是选择最合适的一种。

.Net Framework 4.0 Beta 2为字符串提供了一个新的IsNullOrWhiteSpace()方法,该方法将IsNullOrEmpty()方法推广为除了空字符串之外还包括其他空白。

术语“空白”包括屏幕上不可见的所有字符。例如,空格,换行符,制表符和空字符串是空格字符*

参考:这里

对于性能而言,IsNullOrWhiteSpace并不理想,但很好。该方法调用将导致较小的性能损失。此外,如果您不使用Unicode数据,则IsWhiteSpace方法本身具有一些可以删除的间接寻址。与往常一样,过早的优化可能是邪恶的,但这也很有趣。

参考:这里

检查源代码(参考源.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

现在我很困惑:“IsNullOrWhiteSpace是一个方便的方法类似于下面的代码,但它提供了卓越的性能”从这里开始:msdn.microsoft.com/en-us/library/...
robasta

@rob有问题的代码为return String.IsNullOrEmpty(value) || value.Trim().Length == 0;,其中涉及新的字符串分配和两个单独的检查。最有可能在IsNullOrWhitespace内部,通过检查字符串中的每个char是否为空格来单次通过而不进行任何分配,从而实现了出色的性能。到底是什么让您感到困惑?
伊万·丹尼洛夫

10
谢谢!我不知道是否IsNullOrWhitespace()会匹配一个空字符串。本质上IsNullOrEmpty()匹配的子集IsNullOrWhitespace()
gligoran 2015年

155

实践上的差异:

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

4
我认为这应该是公认的答案。通过显示实际示例而不是重定向,比接受的答案更有意义。
eaglei22

37

它们是不同的功能。您应根据自己的情况决定需要什么。

我不认为将它们中的任何一个当作坏习惯。大多数时间IsNullOrEmpty()就足够了。但是您可以选择:)


2
例如,注册页面上的用户名字段将使用IsNullOrEmtpy进行验证,因此用户名称中不能包含空格。
克里斯,

14
@Rfvgyhn:如果要检查用户名在任何地方都没有空格-您应该使用Contains。如果要确保用户名不能包含空格- IsNullOrWhiteSpace可以。IsNullOrEmpty确保仅以某种方式输入用户名。
伊凡·丹尼洛夫

1
确实。我只是想举一个具体的例子来补充您的答案。在现实世界中,用户名验证规则通常包含的逻辑要比仅检查其空白或空白多得多。
克里斯(Chris)

28

这是这两种方法的实际实现(使用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!这是一个奖金:)
ΕГИІИО

4
是的,最安全的方法是使用IsNullOrWhiteSpace(对于String.empty,null和whitespace为True)
dekdev

7

它说这一切IsNullOrEmpty()都不包括空格IsNullOrWhiteSpace()

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

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


2
我之所以投票,是因为当您解释每个功能的作用时,您没有回答实际的问题。
tuespetre 2014年

2
您应该编辑答案,以包括框架定义的“空白”的整个列表:术语“空白”包括屏幕上不可见的所有字符。例如,空格,换行符,制表符和空字符串是空白字符。
乔治,2016年

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)的时间。对于具有正常大小字符串的单计时器,性能差异将可忽略不计。如果您要处理大量文本或以较大的循环调用它,则可能不想使用它。
Charles Owen

1

string.IsNullOrEmpty(str)-如果您想检查是否提供了字符串值

string.IsNullOrWhiteSpace(str)-基本上,这已经是一种业务逻辑实现(即,为什么“”不好,但是像“ ~~”一样好)。

我的建议-不要将业务逻辑与技术检查混在一起。因此,例如,string.IsNullOrEmpty是在方法开始时检查其输入参数的最佳方法。


0

那这一切呢...

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

如果存在空格,则会对所有空格进行修剪,以避免IsWhiteSpace的性能下降,这将使字符串在不为null的情况下满足“空”条件。

我也认为这很清楚,而且无论如何都要修剪字符串,这通常是个好习惯,尤其是当您将它们放入数据库或其他内容时。


34
这种检查有一个严重的缺点。当将x传递为null时,在x上调用Trim()将导致null引用异常。
ΕГИІИО

9
好点子。错误地使答案不正确以显示缺点。
Remotec 2011年

1
IsNullOrWhitespace可以优化以检查是否为空或为空,避免检查字符串中的空白。此方法将始终执行修剪操作。同样,尽管可能对其进行了优化,但可能会在内存中创建另一个字符串。
Sprague 2012年

如果(string.IsNullOrEmpty(x?.Trim())应该解决null问题
Cameron Forward

0

在.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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.