Ответы:
Лучшей практикой является выбор наиболее подходящей.
.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