2009-04-24 2 views
7

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

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

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

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

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

ответ

27

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

+0

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

+10

IsNullOrEmpty похоже, что это было бы наиболее приятно реализовано как свойство, действительно, но, к сожалению, у нас нет свойств расширения. – mquander

27

Если строка будет 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); 
    } 
} 

С помощью этого метода расширения follwing никогда не будет выброшено исключение,

String test = null; 

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

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

StringExtension.IsNullOrEmpty(test); 
5

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

3

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

+0

Нет, если он реализован как метод расширения, поэтому я и спрашивал в первую очередь. –

0

Вы могли бы сделать это произошло в C# 3.0:

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

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

test.IsNullOrEmpty(); 

НО

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

+0

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

2

Я создал метод расширения - 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; 
} 
+0

Спасибо за идею. – tvanfosson

+0

... и он все еще проходит мои модульные тесты !!! – tvanfosson

0

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

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

общественности статической BOOL IsTrimStringNullOrEmpty (значение строки)
{
        если (значение == NULL) возвращает истину;
        if (value.Trim() == string.Empty) return true;
        return false;
}

ИЛИ

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

общественности статической BOOL IsTrimStringNullOrEmpty (исх значение строки)
{
        if (value == null) return true;
        value = value.Trim();
        if (value == string.Empty) return true;
        return false;
}

1

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

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

Смежные вопросы