Подтвердить что ты не робот

String.IsNullOrEmpty() vs string.NotNullOrEmpty()

Мне интересно, если какие-либо разработчики используют string.IsNullOrEmpty() чаще с отрицательным, чем с положительным

например.

if (!string.IsNullOrEmpty())

Вот как я использую метод в 99% случаев. Каково было конструктивное решение для этого?

4b9b3361

Ответ 1

Потому что "IsNullOrEmpty" легче понять, чем "NotNullOrEmpty". Последнее можно интерпретировать как:

  • Это не пустое и не пустое
  • Это не пусто или пусто.

Ответ 2

Двойные негативы обычно обескураживают именованием. !string.NotNullOrEmpty(...) сделает это.

Ответ 3

Для тех логиков там! string.IsNullOrEmpty не эквивалентен string.IsNotNullOrEmpty. @Guffa имеет это правильно. Используя закон DeMorgan, он должен быть string.IsNotNullAndNotEmpty эквивалентен.

¬ (null ∨ empty) ⇔ ¬null ∧ ¬empty

¬ (null ∨ empty) ≠ ¬null ∨ empty

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

Ответ 4

Как примечание, я предпочитаю метод расширения:

public static class StringExtensions
{
    public static bool IsNullOrEmpty(this string value)
    {
        return string.IsNullOrEmpty(value);
    }
}

Я считаю, что лучше сказать:

if(myValue.IsNullOrEmpty())

или

if(!myValue.IsNullOrEmpty())

Ответ 5

Соглашения об именах С# диктуют, что ваши выражения должны быть в позитиве, такие как "Is...", а не "IsNot..."

EDIT: Обычно я использую его при выполнении проверки ошибок и проверки ввода в начале метода и создания исключения, если параметр является нулевым или пустым.

if (string.IsNullOrEmpty(myParameter))
{
throw new ....
}

Ответ 6

Возможно, потому, что тогда имя должно быть длинным IsNotNullAndNotEmpty, чтобы быть конкретным.

Ответ 7

Я всегда создаю метод расширения для "HasContent()", который в целом имеет смысл, следует "положительным" спецификациям и сохраняет разбухание кода, потому что я использую его гораздо чаще, чем его аналог:

public static bool HasContent(this string s) {
    return !string.IsNullOrEmpty(s);
}

Ответ 8

Конечно, вы всегда можете использовать string.IsNullOrWhiteSpace(string) вместо string .IsNullOrEmpty(string) из .NET 4.0

Ответ 9

Это наиболее распространенное использование, которое я видел.

Ответ 10

"NotNullOrEmpty" неоднозначно, это может означать "(не пустое) или пустое", или это может означать "не (нулевой или пустой)". Чтобы сделать это однозначным, вам придется использовать "NotNullAndNotEmpty", который является аппетитным.

Кроме того, именование "IsNullOrEmpty" поощряет использование в качестве предложения охраны, которое, по моему мнению, полезно. Например:.

if (String.IsNullOrEmpty(someString))
{
   // error handling
   return;
}
// do stuff

который, как мне кажется, чище, чем:

if (!String.IsNullOrEmpty(someString))
{
   // do stuff
}
else
{
   // error handling
   return;
}

Ответ 11

На самом деле я был бы склонен предложить другой ответ из "этого двусмысленного" объяснения, предоставленного несколькими другими (хотя я тоже согласен с этим ответом):

Лично мне нравится минимизировать вложенность в моем коде, так как (для меня), чем больше фигурных скобок имеет код, тем сложнее он будет следовать.

Поэтому я бы предпочел это (например):

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, всегда будет структурирован; но я думаю, что это на самом деле довольно распространено.

Ответ 12

Лично я предпочитаю сначала использовать сценарий без отрицания. Мне просто нужно сначала сделать истинную часть, а затем ложную. Приходит вплоть до личного стиля.

Ответ 13

Я всегда думал, что это кажется неправильным, поскольку я использую негатив гораздо чаще, чем положительный.

Я бы также хотел, чтобы там был экземпляр IsEmpty() или IsNotEmpty() для использования, когда переменная объявлена ​​внутри функции. Это не может быть IsNullOrEmpty() или IsNotNullOrEmpty(), как если бы экземпляр был пустым, тогда вы получите исключение с нулевой ссылкой.