Почему нет метода перегрузки IsNullOrEmpty без параметров? - PullRequest
7 голосов
/ 24 апреля 2009

При попытке выяснить, является ли строка нулевой или пустой, обычно у меня уже есть строка. Вот почему я ожидал, что такая служебная функция, как String.IsNullOrEmpty () будет работать без параметров:

String myString;
bool test=myString.IsNullOrEmpty();

Однако это не работает, поскольку IsNullOrEmpty ожидает параметр String. Вместо этого я должен написать:

String myString;
bool test=String.IsNullOrEmpty(myString);

Почему это так? Это кажется излишне неуклюжим. Конечно, я могу легко написать собственный метод расширения для этого, но это кажется очень очевидным упущением, поэтому я задаюсь вопросом, есть ли для этого веские причины. Я не могу поверить, что перегрузка этой функции без параметров была просто забыта Microsoft.

Ответы [ 8 ]

27 голосов
/ 24 апреля 2009

Если строка будет null, вызов IsNullOrEmpty() вызовет NullReferenceException.

 String test = null;

 test.IsNullOrEmpty(); // Instance method causes NullReferenceException

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

public static class StringExtension
{
   public static Boolean IsNullOrEmpty(this String text)
   {
      return String.IsNullOrEmpty(text);
   }
}

С помощью этого метода расширения следующий никогда не сгенерирует исключение

 String test = null;

 test.IsNullOrEmpty(); // Extension method causes no NullReferenceException

потому что это просто синтаксический сахар для этого.

 StringExtension.IsNullOrEmpty(test);
27 голосов
/ 24 апреля 2009

Этот метод существовал задолго до того, как методы расширения были добавлены в C #, и до методов расширения не было никакого способа определить метод / свойство экземпляра, такое как xyz.IsNullOrEmpty(), которое можно было бы вызвать, если xyz было null.

5 голосов
/ 24 апреля 2009

До C # 3.0 и методов расширения не было возможности вызвать метод для нулевого объекта.

3 голосов
/ 24 апреля 2009

Причина, по которой метод экземпляра отсутствует, заключается в том, что если строка действительно пуста, myString.IsNullOrEmpty будет выдавать.

2 голосов
/ 24 апреля 2009

Я создал метод расширения - IsNothing, - который будет проверять не только, является ли он пустым или пустым, но также содержит только пробелы.

public static bool IsNothing( this string source )
{
    if (source == null || source.Length == 0)
    {
        return true;
    }
    else if (source.Trim().Length == 0)
    {
        return true;
    }
    return false;
}
1 голос
/ 24 апреля 2009

Хотя вполне возможно (и допустимо) определить метод расширения для достижения этой цели, я был бы обеспокоен тем, что он выглядит странно синтаксически, поскольку он выглядит как вызов метода для объекта, который может быть нулевым.

YMMV, но я буду придерживаться String.IsNullOrEmpty.

0 голосов
/ 24 апреля 2009

Если вы находитесь в процессе добавления методов расширения или вспомогательных методов для тестирования ваших строк, вы можете также захотеть добавить тот, который обрезает строку, так как большинство из нас во многих случаях также не хотят строку с таким пробелом, как как табуляция или пробелы.

Вот один из наших методов испытаний

public static bool IsTrimStringNullOrEmpty (строковое значение)
{
if (value == null) возвращает true;
if (value.Trim () == string.Empty) возвращает true;
вернуть ложь;
}

OR

Если вы хотите проверить значение и одновременно обрезать его, если NotNullOrEmpty

public static bool IsTrimStringNullOrEmpty (ссылка на строковое значение)
{
if (value == null) возвращает true;
value = value.Trim ();
if (value == string.Empty) возвращает true;
вернуть ложь;
}

0 голосов
/ 24 апреля 2009

Вы можете сделать это в C # 3.0:

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

Тогда это будет работать:

test.IsNullOrEmpty();

НО

Важно знать, что многие считают это плохой практикой. Это потому, что это нарушает ожидания пользователя. Используйте с этой осторожностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...