Разбор против TryParse


111

В чем разница между Parse () и TryParse ()?

int number = int.Parse(textBoxNumber.Text);

// The Try-Parse Method
int.TryParse(textBoxNumber.Text, out number);

Есть ли какая-то форма проверки ошибок, например, блокировка попыток?

Ответы:


155

Parseвыдает исключение, если не может проанализировать значение, тогда как TryParseвозвращает, boolуказывающее, удалось ли это сделать.

TryParseне просто try/ catchвнутренне - весь смысл в том, что он реализован без исключений, так что это быстро. Фактически, наиболее вероятным способом реализации этого Parseметода является внутренний вызов метода, TryParseа затем выдача исключения в случае возврата false.

Короче говоря, используйте, Parseесли уверены, что значение будет действительным; в противном случае используйте TryParse.


1
«внутри метод Parse вызывает TryParse», за исключением того, что Parse предшествует TryParse на несколько версий. Конечно, они могли перенести основную реализацию в TryParse ...
Джоэл Коэхорн,

4
@Joel - Я предполагал, что они переместили бы реализацию, но я только что взглянул на отражатель, и это отдельные реализации с точно таким же кодом, кроме того, что у одного есть 'throw ...' и у одного 'return false'. Интересно, почему они не консолидированы ?!
Грег Бич

6
Хотя, если подумать, Parse выбрасывает несколько разных исключений, поэтому, если бы все, что у него было, было логическим значением из TryParse, он бы не знал, какое из них выбросить.
Грег Бич,

5
«используйте Parse, если уверены, что значение будет действительным». Я бы добавил: «но вы признаете, что можете ошибаться». Если бы вы были на 100% уверены, что он может выполнять синтаксический анализ, вы могли бы с таким же успехом использовать TryParse, который мог бы быть быстрее.
Джон

2
И под «разными исключениями» @GregBeech означает сообщение, а не класс.
Пол Дрейпер

26

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

  • int.Parse() вызовет исключение
  • int.TryParse() вернет false (но не выдаст исключение)

Что, если я использую int.TryParse (some_method_that_throws_exception (), out int test)? Будет ли обнаружено какое-либо исключение или только те, которые связаны с синтаксическим анализом?
Alexandru Antochi

@AlexandruAntochi Вы не должны задавать вопрос в качестве комментария. Это сделает практически невозможным получение полезных ответов для других. Однако, чтобы оно того стоило, ответ на ваш вопрос - нет, int.TryParse вообще не выбрасывает. Если метод не может выполнить синтаксический анализ, он отразит это только возвращением значения false. Это делает удобным использование if (int.TryParse… для выполнения каких-либо действий только в случае успешного синтаксического анализа.
Роб

3

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

В качестве сноски, передача null большинству методов TryParse вызовет исключение.


Передача null базовым типам (int, double, DateTime и т. Д.) НЕ вызовет исключения,
доктор Юнке,

3

TryParse и налог на исключение

Parse генерирует исключение, если преобразование строки в указанный тип данных завершается неудачно, тогда как TryParse явно избегает создания исключения.


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

1
Отличная ссылка. Я удивлен, что никто еще не начал дискуссию, «какая из них лучше или какая практика кодирования должна применяться».
Кристиан Мэдсен,

0

TryParse не возвращает значение, он возвращает код состояния, чтобы указать, удалось ли выполнить синтаксический анализ (и не генерирует исключение).


6
TryParse возвращает значение через параметр два, который указан с ключевым словом out.
Кристиан Мэдсен,

0

Для записи я тестирую два кода: которые просто пытаются преобразовать из строки в число, и если это не удается, присваивают число ноль.

        if (!Int32.TryParse(txt,out tmpint)) {
            tmpint = 0;
        }

и:

        try {
            tmpint = Convert.ToInt32(txt);
        } catch (Exception) {
            tmpint = 0;
        }

Для С # лучшим вариантом является использование tryparse, потому что альтернатива try & Catch вызвала исключение

A first chance exception of type 'System.FormatException' occurred in mscorlib.dll

Это мучительно медленно и нежелательно, однако код не останавливается, пока исключение Debug не остановлено с ним.


Первый фрагмент кода ничего не делает, так как tmpint уже будет установлен в ноль, если строка не может быть проанализирована как int.
Эндрю Нили

0

Я знаю, что это очень старый пост, но подумал о том, чтобы поделиться более подробной информацией о Parse vs TryParse.

У меня был сценарий, в котором DateTime нужно преобразовать в String, и если datevalue null или string.empty, мы столкнулись с исключением. Чтобы решить эту проблему, мы заменили Parse на TryParse и получим дату по умолчанию.

Старый код:

dTest[i].StartDate = DateTime.Parse(StartDate).ToString("MM/dd/yyyy");
dTest[i].EndDate = DateTime.Parse(EndDate).ToString("MM/dd/yyyy");

Новый код:

DateTime startDate = default(DateTime);
DateTime endDate=default(DateTime);
DateTime.TryParse(dPolicyPaidHistories[i].StartDate, out startDate);
DateTime.TryParse(dPolicyPaidHistories[i].EndDate, out endDate);

Необходимо объявить другую переменную и использовать ее как Out для TryParse.


Вам не нужно инициализировать startDateи, endDateкак DateTime.TryParseвсегда, перезаписать их DateTime.MinValue. Если неправильные представления даты должны быть преобразованы в другое значение, проверьте возвращаемое значение DateTime.TryParseи, если оно ложно, установите значение явно.
Палец

Использование DateTime?( DateTime nullable )
Kiquenet

-1

double.Parse ("-"); вызывает исключение, а double.TryParse ("-", разобрано); анализирует до 0, поэтому я предполагаю, что TryParse выполняет более сложные преобразования.


4
Но разве TryParseвозвращается trueили false? Вот как вы узнаете, было ли оно «действительным».
Пол Дрейпер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.