2009-11-06 3 views
14

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

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

Дополнительную информацию можно найти здесь (link). 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) суммирует метод (ИМХО) довольно хорошо:

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

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

ответ

24

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

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

+0

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

0

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

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

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

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

+0

Нет причин дублировать функциональность фреймворка. Это ошибка, исправленная в .net 2.0sp1 - зачем ее избегать? –

+0

Спасибо, да, я согласен. Не нужно вникать в нечто сверхъестественное, но до тех пор, пока оно пропало, я не мог найти причину * не использовать его. Спасибо за код замены. Я могу это реализовать. – osij2is

+0

@Reed Copsey - Если они были затронуты им, то они, возможно, не обновились до .NET2sp1. Разумеется, они должны обновиться, но если у них нет, то вместо того, чтобы бороться с чем-то довольно тривиальным, просто обойдите его. –

4

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

+0

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

2

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

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

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

Что касается использования или нет, ознакомьтесь с этим post by CodingHorror.

1

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

1

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

+0

«... это все о знании плюсов и минусов и принятии образованного решения на основе этой информации». - Разве это не * почему я спрашиваю здесь? Чтобы * принять * и * образованное решение? – osij2is

+0

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

3

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

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

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

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

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

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

+0

Я не думаю, что проблема VS2005. Он использует версию среды .NET 2.0 с пакетом обновления 1 (SP1). Начиная с C# 3.0 были добавлены методы расширения, но вполне возможно использовать их в библиотеке 2.0 2.0 с небольшой настройкой: http://geekswithblogs.net/robp/archive/2007/12/20/using-extension-methods- в-.net-2,0-с-визуальному-студия-2008.aspx –

+0

Не было идеи (до сих пор), что методы расширения могут быть успешно вызваны, когда экземпляр имеет значение NULL. –

5

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

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

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

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

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

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

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

+0

Поэтому я всегда * предпочитаю * метод IsNullOrEmpty. Два действия за один простой шаг. Когда дело доходит до строк, я нахожу, что большинство людей склонны кодоваться против одного или другого (пустые против нуля), но редко и то, и другое. Я предпочитаю проверять как пустые, так и нулевые, если у меня нет большого опыта работы с конкретным приложением или имплантацией. – osij2is

+0

@ osij2is: рассмотрите семантику кода также ... Если вы используете IsNullOrEmpty, это означает, что вы ожидаете, что ссылка будет иметь значение null иногда, и если ссылка никогда не должна быть нулевой, проверка на нее делает код запутанным. – Guffa

+6

«Это никогда не происходит в реальном коде» - очень оптимистичная мера. – peterchen

-5

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

+0

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

1

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