String.IsNullOrEmpty (myString) против myString! = Null - PullRequest
5 голосов
/ 24 января 2010

Какой из этих трех лучше?

string myString = ""; 
String.IsNullOrEmpty(myString);

vs

string myString = "";
if(myString.Length > 0 || myString != null)

vs 

string myString = "";
if (m.Length > 0 | m != null)

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

Ответы [ 7 ]

17 голосов
/ 24 января 2010

Ну и версия в вопросе:

if(myString.Length > 0 || myString != null)

будет определенно хуже, поскольку вы должны проверить на null первое (не второе) - идеально короткое замыкание на null, чтобы не пытайтесь позвонить .Length. Но в целом я бы просто использовал string.IsNullOrEmpty. Вы всегда можете написать метод расширения, чтобы сделать его менее подробным, если хотите (вы можете вызывать методы расширения для значений null).

static bool HasValue(this string s) {
    return !string.IsNullOrEmpty(s);
}
4 голосов
/ 24 января 2010

Перейти с string.IsNullOrEmpty(str). Это яснее и лаконичнее. Это не будет узким местом в вашем приложении.

Если вам нужно только проверить строку «пустота», то я бы пошел с проверкой на string.Empty, так как она лучше выражает ваши намерения.

2 голосов
/ 24 января 2010

Как уже говорили другие, IsNullOrEmpty () превосходит ручные проверки в целях удобства сопровождения и вряд ли пострадает в производительности благодаря решениям JIT-компилятора во время выполнения относительно встраивания (см. комментарии Эрика Ганнерсона ).

Если кому-то еще интересно, как выглядит фактическая реализация .NET, вот код .NET 4:

[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public static bool IsNullOrEmpty(string value)
{
    if (value != null)
    {
        return (value.Length == 0);
    }
    return true;
}

Этот атрибут указывает, что метод также будет встроен в NGen (то есть, нативные) изображения.

2 голосов
/ 24 января 2010

Я бы использовал IsNullOrEmpty.

Будет легче разобрать, когда вы просмотрите код позже.

Вот еще одна - немного странная - причина. Некоторый более поздний программист должен прийти позже, почесать бороду и сказать: «Я думаю, что myString.trim (). Length! = 0 лучше» и изменить его.

Как уже отмечали другие: проверка на нулевую секунду является потенциальной ошибкой нулевого доступа, ожидающей, что произойдет - библиотечная процедура гарантированно будет в порядке.

1 голос
/ 24 января 2010

String.IsNullOrEmpty - лучший выбор, если вы не уверены в том, как проверить различные состояния ссылки на строку (что вы, очевидно, и не поняли ...;).

Использование метода IsNullOrEmpty:

if (String.IsNullOrEmpty(s)) ...

эквивалентно использованию теста на короткое замыкание для нулевой и нулевой длины:

if (s == null || s.Length == 0) ...

Если вы знаете, что референ не может быть нулевым, вы можете пропустить эту проверку и просто проверить длину:

if (s.Length == 0) ...

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

0 голосов
/ 22 марта 2012

I believe the String.IsNullOrEmpty(String s) is implemented as: if (s == null || s.Length == 0) ... in the API.

Это неправильно. Попробуйте, и вы получите исключение, так как два утверждения будут опробованы. Если s равно null, то s.Length выдаст исключение.

0 голосов
/ 24 января 2010

Я считаю, что String.IsNullOrEmpty (String s) реализован как:

if (s == null || s.Length == 0) ...

в API.

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