string.IsNullOrEmpty (string) против string.IsNullOrWhiteSpace (string)


207

string.IsNullOrEmpty(string)Считается ли использование при проверке строки плохой практикой, когда есть string.IsNullOrWhiteSpace(string)в .NET 4.0 и выше?

Ответы:


328

Лучшей практикой является выбор наиболее подходящей.

.Net Framework 4.0 Beta 2 имеет новый метод IsNullOrWhiteSpace () для строк, который обобщает метод IsNullOrEmpty (), чтобы также включать другие пробелы помимо пустой строки.

Термин «пробел» включает в себя все символы, которые не видны на экране. Например, пробел, разрыв строки, табуляция и пустая строка являются пробелами * .

Ссылка: здесь

Для производительности IsNullOrWhiteSpace не идеален, но хорош. Вызов метода приведет к небольшому снижению производительности. Кроме того, сам метод IsWhiteSpace имеет некоторые косвенные указания, которые можно удалить, если вы не используете данные Unicode. Как всегда, преждевременная оптимизация может быть злой, но это также весело.

Ссылка: здесь

Проверьте исходный код (ссылка на источник .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 это делается с помощью одного прохода без каких-либо выделений, проверяя, что каждый символ в строке является пробелом, следовательно, превосходная производительность. Что тебя смущает на самом деле?
Иван Данилов

10
Спасибо! Я никогда не знал, IsNullOrWhitespace()будет ли соответствовать пустой строке. По сути, IsNullOrEmpty()соответствует подмножеству IsNullOrWhitespace().
gligoran

156

Отличия на практике:

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
На самом деле. Я просто пытался привести конкретный пример, чтобы добавить к вашему ответу. В реальном мире правило проверки имени пользователя обычно содержит немного больше логики, чем просто проверка, является ли оно пустым или пробелом.
Крис

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 (True для String.empty, null и
whitespace

7

Это говорит о том, что все IsNullOrEmpty()это не включает интервал белого, в то время как IsNullOrWhiteSpace()делает!

IsNullOrEmpty()Если строка:
-Null
-Empty

IsNullOrWhiteSpace()Если строка:
-Null
-Empty -Содержит
только пробелы


2
Я опустил голос, потому что, пока вы объясняете, что делает каждая функция, вы не отвечаете на реальный вопрос.
tuespetre

2
Вы должны отредактировать свой ответ, включив в него весь список для «пробела», как это определено структурой: термин «пробел» включает в себя все символы, которые не видны на экране. Например, пробел, разрыв строки, табуляция и пустая строка - это пробельные символы.
Джордж

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) времени. Для таймера со строкой нормального размера разница в производительности будет незначительной. Если вы обрабатываете очень большие объемы текста или вызываете его в большом цикле, вы, вероятно, не захотите его использовать.
Чарльз Оуэн

1

string.IsNullOrEmpty (str) - если вы хотите проверить, предоставлено ли строковое значение

string.IsNullOrWhiteSpace (str) - по сути, это уже своего рода реализация бизнес-логики (то есть, почему "" плохая, а что-то вроде "~~" хорошая).

Мой совет - не смешивайте бизнес-логику с техническими проверками. Так, например, string.IsNullOrEmpty лучше всего использовать в начале методов для проверки их входных параметров.


0

Как насчет того, чтобы поймать всех ...

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

Это обрезает все пробелы, если они там, избегая снижения производительности IsWhiteSpace, что позволит строке соответствовать «пустому» условию, если оно не равно нулю.

Я также думаю, что это более понятно, и в целом это хорошая практика - обрезать строки в любом случае, особенно если вы помещаете их в базу данных или что-то в этом роде.


34
Эта проверка имеет серьезный недостаток. Вызов Trim () для x приведет к исключению нулевой ссылки, когда оно передается как нулевое.
Ε Г И І И О

9
Хорошая точка зрения. Я оставлю неправильный ответ, чтобы показать недостаток.
Remotec

1
IsNullOrWhitespace МОЖЕТ оптимизировать проверку на наличие нулевого или пустого, избегая проверки строки на наличие пробелов. Этот метод всегда выполняет операцию обрезки. Кроме того, хотя он может быть оптимизирован, он, вероятно, создаст другую строку в памяти.
Sprague

if (string.IsNullOrEmpty (x? .Trim ()) должен обойти нулевую проблему
Камерон Форвард

0

В стандарте .Net 2.0:

string.IsNullOrEmpty()Указывает, является ли указанная строка пустой или пустой строкой.

Console.WriteLine(string.IsNullOrEmpty(null));           // True
Console.WriteLine(string.IsNullOrEmpty(""));             // True
Console.WriteLine(string.IsNullOrEmpty(" "));            // False
Console.WriteLine(string.IsNullOrEmpty("  "));           // False

string.IsNullOrWhiteSpace(): Указывает, является ли указанная строка нулевой, пустой или состоит только из символов пробела.

Console.WriteLine(string.IsNullOrWhiteSpace(null));     // True
Console.WriteLine(string.IsNullOrWhiteSpace(""));       // True
Console.WriteLine(string.IsNullOrWhiteSpace(" "));      // True
Console.WriteLine(string.IsNullOrWhiteSpace("  "));     // True
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.