string.IsNullOrEmpty (string) vs. string.IsNullOrWhiteSpace (рядок)


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

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

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

7

У ньому сказано, що все IsNullOrEmpty()не включає пробіли між собою IsNullOrWhiteSpace()!

IsNullOrEmpty()Якщо рядок:
-Null
-Empty

IsNullOrWhiteSpace()Якщо рядок:
-Null
-Empty -Зміщує лише
білі простори


2
Я заявив, що, коли ви пояснюєте, що робить кожна функція, ви не відповідаєте на власне питання.
ср

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 призведе до нульового посилання на виняток, коли він передається як null.
Ε Г І І І О

9
Гарна думка. Не можу залишити відповідь неправильною, щоб показати недолік.
Remotec

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

якщо (string.IsNullOrEmpty (x? .Trim ()) слід обійти нульову проблему
Cameron Forward

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.