string.IsNullOrEmpty () против string.NotNullOrEmpty () - PullRequest
28 голосов
/ 09 апреля 2009

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

, например

if (!string.IsNullOrEmpty())

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

Ответы [ 13 ]

58 голосов
/ 09 апреля 2009

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

  1. Это не ноль и не пусто
  2. Это не ноль или пусто
36 голосов
/ 09 апреля 2009

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

12 голосов
/ 09 апреля 2009

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

¬ (null ∨ пусто) ¬ ¬null ∧ ¬empty

¬ (null ∨ пусто) ¬ ¬null ∨ пусто

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

6 голосов
/ 09 апреля 2009

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

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

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

if(myValue.IsNullOrEmpty())

или

if(!myValue.IsNullOrEmpty())
6 голосов
/ 09 апреля 2009

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

РЕДАКТИРОВАТЬ: как правило, я использую его при проверке ошибок и проверки ввода в начале метода и выдает исключение, если параметр является нулевым или пустым.

if (string.IsNullOrEmpty(myParameter)) <br> {<br> throw new ....<br> }<br>

5 голосов
/ 27 апреля 2010

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

public static bool HasContent(this string s) {
    return !string.IsNullOrEmpty(s);
}
4 голосов
/ 09 апреля 2009

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

2 голосов
/ 06 мая 2010

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

1 голос
/ 15 февраля 2010

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

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

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

public bool DoSomethingWithString(string s) {
    if (string.IsNullOrEmpty(s))
        return false;

    // here's the important code, not nested
}

к этому:

public bool DoSomethingWithString(string s) {
    if (!string.IsNullOrEmpty(s)) {
        // here's the important code, nested
    } else {
        return false;
    }
}

Это довольно специфический сценарий (где нулевая / пустая строка запрашивает немедленный выход) и явно не тот способ, которым метод, использующий IsNullOrEmpty, всегда будет структурирован; но я думаю, что это на самом деле довольно распространено.

1 голос
/ 10 апреля 2009

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

Кроме того, именование «IsNullOrEmpty» поощряет использование в качестве охранного предложения, что, на мой взгляд, полезно. E.g.:

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

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

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