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

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

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

Более подробную информацию можно найти здесь (ссылка на сайт). Microsoft ошибка "якобы» исправлено после 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) довольно хорошо подводит итог метода (ИМХО):

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

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

Ответы на вопрос(10)

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

Решение Вопроса

ь его использования.

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

 osij2is06 нояб. 2009 г., 23:50
Спасибо ябуду искать пакет обновления, если онне установлено. Я'я не уверен во всех обручах яМне придется прыгать, но в любом случае, мы должны запускать последний пакет обновления на нашем веб-сервере. Спасибо! Я

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

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;
}

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

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

 Kev06 нояб. 2009 г., 23:56
@James - Пользователь (peterchen) в отчете MS Connect также продемонстрировал ту же проблему с кодом, который вы использовали выше в сломанной версии.
 Guffa06 нояб. 2009 г., 23:51
Если ошибка есть, это 'Это также может произойти с использованием метода замены, поскольку ошибка связана не с самим методом IsNullOrEmpty.
 Reed Copsey06 нояб. 2009 г., 23:41
Там'Нет причин дублировать функциональность фреймворка. Это ошибка, которая была исправлена в .net 2.0sp1 - почему бы ее избежать сейчас?
 James Black06 нояб. 2009 г., 23:44
@ Reed Copsey - Если они были затронуты этим, то, возможно, они не обновились до .NET2sp1. Конечно, они должны обновить, но если они неТогда вместо того, чтобы бороться за что-то довольно тривиальное, просто обойти это.
 osij2is06 нояб. 2009 г., 23:43
Спасибо, да, я согласен. Не нужно разбираться с чем-то большим, чем что-то тривиальное, но пока это исправлено, я не могуне могу найти причинуне используй это. Спасибо за замену кода. Я могу реализовать это.
 James Black07 нояб. 2009 г., 00:01
@Kev - Это удивительно, но хорошо. Итак, каково решение, если вы можетеобновить?
 Kev12 нояб. 2009 г., 12:16
@ Джеймс - яЯ предполагаю установить Service Pack 1 для FW 2.0 или прекратить использование.IsNullOrEmpty
 osij2is06 нояб. 2009 г., 23:44
@ Рид: я нене знаю, если наш веб-сервер работает. NET 2.0SP1, так что еслиявляется Я выиграл'или я не могу заставить наших ИТ-специалистов добавить пакет обновления, который я выиграл?Это нужно реализовать. Но все же, этоПриятно иметь обходной путь, если он возникнет.

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

 IInspectable31 дек. 2012 г., 01:37
Рассмотрите возможность предоставления фактов, когда это возможно. Если вы высказываете свое мнение, по крайней мере, предоставьте какое-то обоснование, чтобы сделать его полезным для других.

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

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

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

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

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

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

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

 osij2is07 нояб. 2009 г., 00:05
Поэтому я всегдапредпочитать метод IsNullOrEmpty. Два действия в одном простом шаге. Когда дело доходит до строк, я обнаружил, что большинство людей склонны кодировать один или другой (пустой или нулевой), но редко оба. Я предпочитаю проверять как пустые, так и нулевые, если я нене имеет большого опыта работы с конкретным применением или имплантацией.
 peterchen03 февр. 2010 г., 20:19
Это никогда не происходит в реальном коде это очень оптимистичная мера.
 Guffa07 нояб. 2009 г., 00:46
@ osij2is: Рассмотрим также семантику кода ... Если вы используете IsNullOrEmpty, это означает, что вы ожидаете, что ссылка иногда будет нулевой, и если ссылка никогда не должна быть нулевой, проверка на это делает код запутанным. "

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

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

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

string.IsNullOrEmpty

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

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

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

string myString = null;
if (myString.IsNullOrEmpty())
{
  // Still works
}
 James Black07 нояб. 2009 г., 00:02
VS2005 выигралработать с расширениями. Я склонен использовать расширение самостоятельно только потому, что считаю более естественным писать.
 Yannick Motton07 нояб. 2009 г., 00:16
Я неЯ думаю, что VS2005 является проблемой. Он использует версию платформы .NET 2.0 pre SP1. Начиная с C # 3.0 были добавлены методы расширения, но вполне возможно использовать их в библиотеке фреймворков 2.0 с небольшим изменением:geekswithblogs.net/robp/archive/2007/12/20/...
 Mike Powell03 февр. 2010 г., 19:50
До сих пор не подозревал, что методы расширения могут быть успешно вызваны, когда экземпляр имеет значение null.

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

 osij2is06 нояб. 2009 г., 23:49
К сожалению, мой нынешний работодатель нереально внедрить модульное тестирование. Не сказать, что я бы неНе упустите шанс, но спасибо за идею. Может быть это'Это всего лишь еще одна причина, по которой я могу дать руководствудолжен быть модульным тестированием для начала.

Все о знании плюсов и минусов и принятии обоснованного решения на основе этой информации. ПО МОЕМУ МНЕНИЮ."

 osij2is07 нояб. 2009 г., 01:30
...Это'Все о знании плюсов и минусов и принятии обоснованного решения на основе этой информации. " - нетт этопочему я'я спрашиваю здесь? кделать а такжеобразованный решение?
 jaywon07 нояб. 2009 г., 03:09
@ osij2is - мой комментарий не должен был быть оскорбительным. другие уже заявили, что ошибка была исправлена, поэтому я не чувствовал необходимости повторять ответ. Я просто оценил разницу во мнениях между вами и вашим коллегой. если вы теперь знаете, что решение вполне приемлемо, у вас теперь есть аргумент, почему это нормально .... ИМХО :)

Ваш ответ на вопрос