Відповіді:
Найкраща практика - вибір найбільш підходящого.
.Net Framework 4.0 Beta 2 має новий метод IsNullOrWhiteSpace () для рядків, який узагальнює метод IsNullOrEmpty () для включення іншого порожнього простору, крім порожнього рядка.
Термін "пробіл" включає всі символи, які не видно на екрані. Наприклад, пробіл, розрив рядка, вкладка та порожній рядок - це символи пробілу * .
Довідка: Тут
Для продуктивності IsNullOrWhiteSpace не ідеально, але це добре. Метод викликів призведе до невеликого штрафу за продуктивність. Крім того, сам метод IsWhiteSpace має деякі непрямі, які можна видалити, якщо ви не використовуєте дані Unicode. Як завжди, передчасна оптимізація може бути злом, але це також весело.
Довідка: Тут
Перевірте вихідний код (Довідкове джерело .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 це робиться за допомогою одного пропуску без будь-яких розподілів, перевіряючи, що кожен знак у рядку є пробілом, отже, найкраща продуктивність. Що вас насправді бентежить?
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 набагато повільніше: /
string.IsNullOrEmpty (str) - якщо ви хочете перевірити, чи вказано значення рядка
string.IsNullOrWhiteSpace (str) - в основному це вже свого роду реалізація бізнес-логіки (тобто чому "" погано, але щось на зразок "~~" добре).
Моя порада - не змішуйте ділову логіку з технічними перевірками. Так, наприклад, string.IsNullOrEmpty найкраще використовувати на початку методи перевірки їх вхідних параметрів.
Що про це для упіймання всіх ...
if (string.IsNullOrEmpty(x.Trim())
{
}
Це дозволить обрізати всі пробіли, якщо вони там є, уникаючи покарання виконання IsWhiteSpace, що дасть змогу рядку відповідати умові "порожній", якщо його немає.
Я також вважаю, що це зрозуміліше, і загалом є хорошою практикою обрізки рядків у будь-якому випадку, особливо якщо ви вводите їх у базу даних чи щось таке.
У стандарті .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