С# String.IsNullOrEmpty: хорошо или плохо?

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

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

Дополнительную информацию можно найти здесь (ссылка). Microsoft - ошибка "якобы" фиксированных пост-орков, но, к сожалению, мой работодатель все еще использует 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 метод на тип строки, который дает нам хорошие и относительно эффективный метод проверки того, строка в порядке, чтобы сохранить или использовать. Однако, для производительности, может быть, лучше используйте ручные проверки. Пустые строки также могут быть проверены другими способами и мое исследование показывает, что проверка длина самая быстрая.

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

Ответы

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

Ответ 4

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

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

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

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

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

Ответ 5

В этом сообщении об ошибке в указанной ссылке вы указываете:

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

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

Что касается того, следует ли его использовать, посмотрите этот пост от CodingHorror.

Ответ 6

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

Ответ 7

Как и на любом языке или его части, все это касается знания плюсов и минусов и принятия обоснованного решения на основе этой информации. ИМХО.

Ответ 8

При реализации проверки аргументов в 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");
}

Ответ 9

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

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

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

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

Ответ 10

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