Строка C#.IsNullOrEmpty: хорошо или плохо?

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

по состоянию на 4 апреля 2006 года, есть ошибка (возможно в JIT), что делает это ошибка метода при оптимизации включить. Это, как известно, влияют как С# и VB.

более подробную информацию можно найти здесь (ссылке). Microsoft ошибка "предположительно" исправлена post-Orcas, но, к сожалению, мой работодатель все еще использует VS2005. Но если проблема исправлена в 2008+, так тому и быть. Меня это вполне устраивает.

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

после поиска мнений по этому вопросу, я нашел сайты, которые занимают позицию "за / против". Вот некоторые из сайтов, которые я читал об этом:

https://blog.rthand.com/post/2006/06/22/1063.aspx

http://www.omegacoder.com/?p=105

одном сайте (http://dotnetperls.com/isnullorempty) суммирует метод (IMHO) довольно хорошо:

здесь мы смотрели, что IsNullOrEmpty метод типа String, который обеспечивает нас с хорошим и относительно эффективный метод проверки строка в порядке для сохранения или использования. Однако, для повышения производительности может быть лучше использовании ручной проверки. Пустая строка можно также испытать в других путях, и мое исследование показывает, что проверка длина самый быстрый.

предполагая, что исправление ошибки на месте (и работает правильно) в VS2008/2010/etc. есть ли причина не использовать строку.IsNullOrEmpty с VS2005 и за его пределами? Я понимаю, что это может показаться немного излишним для такого глупого маленького метода, но я хотел бы знать, есть ли еще что-то за кулисами и есть ли у кого-нибудь альтернативные объяснения.

10 ответов


эта проблема была исправлена в .NET 2.0 sp1. Теперь нет причин избегать его использования.

Если вы используете .NET 2, у вас должен быть sp1 по многим другим причинам - я не вижу причин избегать этого для ошибки, которая больше не существует.


Я слышал об этой ошибке раньше, и из того, что я могу собрать, она никогда не встречается в реальном коде, только в коде, таком как пример, который на самом деле ничего не делает. Кроме того, ошибка не связана с самим методом IsNullOrEmpty, поэтому она будет возникать независимо от того, как вы проверяете строку.

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

Если строковая переменная равна null, это просто пропустит блок кода:

 if (!String.IsNullOrEmpty(str)) { ... }

Если строковая переменная имеет значение null, это вызовет исключение:

 if (str.Length > 0) { ... }

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


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


мы используем метод расширения для string.IsNullOrEmpty:

public static bool IsNullOrEmpty(this string target)
{
  return string.IsNullOrEmpty(target);
}

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

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

string myString = null;
if (myString.IsNullOrEmpty())
{
  // Still works
}

в этом отчете об ошибке в ссылке, которую вы включаете, говорится:

эта ошибка была исправлена в Microsoft .NET Framework 2.0 пакет обновления 1 (SP1).

поскольку это так, не имеет значения, используете ли вы VS 2005, если у вас установлен SP1 для .NET 2.

Что касается того, использовать его или нет, проверьте это сообщение от CodingHorror.


Я уверен, что он был исправлен на SP1, но в любом случае вы можете создать свой собственный нулевой или пустой метод :)


Как и с любым языком или его частью, все дело в знании плюсов/минусов и принятии обоснованного решения на основе этой информации. ПО МОЕМУ.


при реализации проверки аргументов в API я обычно проверяю каждое условие отдельно и бросаю разные исключения:ArgumentNullException для нулевой ссылки или, в зависимости от спецификаций API,ArgumentException для пустой строки. В этом случае, используя String.IsNullOrEmpty не позволяет различать эти два отдельных условия ошибки.

if (str == null)
{
    throw new ArgumentNullException("str");
}
if (str == string.Empty)
{
    throw new ArgumentException("The string cannot be empty.", "str");
}

если он сломан в вашей версии, то тривиально просто иметь статический метод, который будет выполнять проверку, поэтому просто сделайте:

public static bool isNull(String s) {
  return s == null || s.trim().length == 0;
}

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

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


Мне интересно, почему люди используют строку.Пусто, это не очень хорошо, потому что это инициализированная строка, и эта концепция существует только в .Net-фрейме везде, где это допустимая строка с len 0(серверы БД делают очень четкую дестинкцию между этим и будут жаловаться, если у вас есть логическая проверка на null, но вы получаете и пустую строку). Я думаю, это веревка.IsNullOrEmpty является одним из лучших 5 худших практик/функций, которые я когда-либо видел, потому что каким-то образом он поощряет / заставляет выглядеть нормально людей струны и может рассматриваться как null. Эта функция никогда не должна была быть добавлена, и я думаю, что ребята .Net должны попытаться поэтапно:) кому нужна и пустая строка в любом случае ? Я никогда не использовал его, если мне не пришлось из-за существующих проектов использовать его