Ответ 1
Потому что "IsNullOrEmpty" легче понять, чем "NotNullOrEmpty". Последнее можно интерпретировать как:
- Это не пустое и не пустое
- Это не пусто или пусто.
Мне интересно, если какие-либо разработчики используют string.IsNullOrEmpty() чаще с отрицательным, чем с положительным
например.
if (!string.IsNullOrEmpty())
Вот как я использую метод в 99% случаев. Каково было конструктивное решение для этого?
Потому что "IsNullOrEmpty" легче понять, чем "NotNullOrEmpty". Последнее можно интерпретировать как:
Двойные негативы обычно обескураживают именованием. !string.NotNullOrEmpty(...)
сделает это.
Для тех логиков там! string.IsNullOrEmpty не эквивалентен string.IsNotNullOrEmpty. @Guffa имеет это правильно. Используя закон DeMorgan, он должен быть string.IsNotNullAndNotEmpty эквивалентен.
¬ (null ∨ empty) ⇔ ¬null ∧ ¬empty
¬ (null ∨ empty) ≠ ¬null ∨ empty
Здесь, я думаю, точка зрения заключается в том, что так оно и есть в настоящее время недвусмысленно, поскольку сделать противоположное однозначное было бы громоздким.
Как примечание, я предпочитаю метод расширения:
public static class StringExtensions
{
public static bool IsNullOrEmpty(this string value)
{
return string.IsNullOrEmpty(value);
}
}
Я считаю, что лучше сказать:
if(myValue.IsNullOrEmpty())
или
if(!myValue.IsNullOrEmpty())
Соглашения об именах С# диктуют, что ваши выражения должны быть в позитиве, такие как "Is...", а не "IsNot..."
EDIT: Обычно я использую его при выполнении проверки ошибок и проверки ввода в начале метода и создания исключения, если параметр является нулевым или пустым.
if (string.IsNullOrEmpty(myParameter))
{
throw new ....
}
Возможно, потому, что тогда имя должно быть длинным IsNotNullAndNotEmpty
, чтобы быть конкретным.
Я всегда создаю метод расширения для "HasContent()", который в целом имеет смысл, следует "положительным" спецификациям и сохраняет разбухание кода, потому что я использую его гораздо чаще, чем его аналог:
public static bool HasContent(this string s) {
return !string.IsNullOrEmpty(s);
}
Конечно, вы всегда можете использовать string.IsNullOrWhiteSpace(string)
вместо string .IsNullOrEmpty(string)
из .NET 4.0
Это наиболее распространенное использование, которое я видел.
"NotNullOrEmpty" неоднозначно, это может означать "(не пустое) или пустое", или это может означать "не (нулевой или пустой)". Чтобы сделать это однозначным, вам придется использовать "NotNullAndNotEmpty", который является аппетитным.
Кроме того, именование "IsNullOrEmpty" поощряет использование в качестве предложения охраны, которое, по моему мнению, полезно. Например:.
if (String.IsNullOrEmpty(someString))
{
// error handling
return;
}
// do stuff
который, как мне кажется, чище, чем:
if (!String.IsNullOrEmpty(someString))
{
// do stuff
}
else
{
// error handling
return;
}
На самом деле я был бы склонен предложить другой ответ из "этого двусмысленного" объяснения, предоставленного несколькими другими (хотя я тоже согласен с этим ответом):
Лично мне нравится минимизировать вложенность в моем коде, так как (для меня), чем больше фигурных скобок имеет код, тем сложнее он будет следовать.
Поэтому я бы предпочел это (например):
public bool DoSomethingWithString(string s) {
if (string.IsNullOrEmpty(s))
return false;
// here the important code, not nested
}
:
public bool DoSomethingWithString(string s) {
if (!string.IsNullOrEmpty(s)) {
// here the important code, nested
} else {
return false;
}
}
Это довольно специфический сценарий (где нулевая/пустая строка запрашивает немедленный выход), и это явно не так, как метод, использующий IsNullOrEmpty
, всегда будет структурирован; но я думаю, что это на самом деле довольно распространено.
Лично я предпочитаю сначала использовать сценарий без отрицания. Мне просто нужно сначала сделать истинную часть, а затем ложную. Приходит вплоть до личного стиля.
Я всегда думал, что это кажется неправильным, поскольку я использую негатив гораздо чаще, чем положительный.
Я бы также хотел, чтобы там был экземпляр IsEmpty() или IsNotEmpty() для использования, когда переменная объявлена внутри функции. Это не может быть IsNullOrEmpty() или IsNotNullOrEmpty(), как если бы экземпляр был пустым, тогда вы получите исключение с нулевой ссылкой.