Анализ против TryParse

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

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

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

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


person Kredns    schedule 22.01.2009    source источник


Ответы (8)


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

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

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

person Greg Beech    schedule 22.01.2009
comment
внутренне метод Parse будет вызывать TryParse За исключением того, что Parse предшествует TryParse несколькими версиями. Конечно, они могли бы перенести основную реализацию на TryParse... - person Joel Coehoorn; 22.01.2009
comment
@Joel Джоэл - я предполагал, что они переместили бы реализацию, но я только что посмотрел с помощью рефлектора, и это отдельные реализации с точно одним и тем же кодом, за исключением того, что у одного есть 'throw ...', а у другого есть «вернуть ложь». Интересно, почему они не объединены?! - person Greg Beech; 22.01.2009
comment
Хотя, если подумать, Parse генерирует ряд различных исключений, поэтому, если бы все, что у него было, было логическим значением от TryParse, тогда он не знал бы, какое из них выбрасывать. - person Greg Beech; 22.01.2009
comment
используйте Parse, если вы уверены, что значение будет допустимым. Я бы добавил, но вы признаете, что можете ошибаться. Если бы вы были на 100% уверены, что он может выполнить синтаксический анализ, вы могли бы точно так же правильно использовать TryParse, который может быть быстрее. - person Jon; 15.02.2013
comment
И за разными исключениями @GregBeech означает сообщение, а не класс. - person Paul Draper; 20.04.2013

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

  • int.Parse() вызовет исключение
  • int.TryParse() вернет false (но не выдаст исключение)
person M4N    schedule 22.01.2009
comment
Что, если я использую int.TryParse(some_method_that_throws_exception(), вне теста int)? Будет ли он ловить какие-либо исключения или только те, которые связаны с синтаксическим анализом? - person Alexandru Antochi; 12.11.2018
comment
@AlexandruAntochi Вы не должны задавать вопрос в качестве комментария. Это сделает почти невозможным для других получение полезных ответов. Однако, чтобы это того стоило, ответ на ваш вопрос - нет, int.TryParse вообще не будет бросать вызов. Если методу не удастся выполнить синтаксический анализ, он отразит это только возвращаемым значением false. Это делает удобным использование if(int.TryParse… для выполнения каких-либо действий только в случае успешного синтаксического анализа. - person Rob; 23.01.2019

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

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

person Ray Booysen    schedule 22.01.2009
comment
Передача нулевого значения базовым типам (int, double, DateTime и т. д.) НЕ приведет к возникновению исключения. - person Dr Yunke; 11.04.2018

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

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

person Gulzar Nazim    schedule 22.01.2009
comment
TryParse выдаст исключение, если вы передадите null для большинства встроенных методов TryParse. - person Ray Booysen; 22.01.2009
comment
Отличная ссылка. Я удивлен, что никто еще не начал дискуссию о том, какой из них лучше или какую практику кодирования следует применять. - person Christian Madsen; 14.02.2010

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

person Mark Brittingham    schedule 22.01.2009
comment
TryParse возвращает значение через второй параметр, указанный с помощью ключевого слова out. - person Christian Madsen; 14.02.2010

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

        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 не разрешено для остановки с ним.

person magallanes    schedule 18.02.2012
comment
Первый фрагмент кода ничего не делает, так как tmpint уже будет установлен в ноль, если строка не может быть проанализирована как целое число. - person Andrew Neely; 29.06.2015

Я знаю, что это очень старый пост, но решил поделиться еще несколькими подробностями о 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.

person LifeOfPi    schedule 31.05.2017
comment
Вам не нужно инициализировать startDate и endDate как DateTime.TryParse всегда будет перезаписывать их на DateTime.MinValue. Если неверные представления даты должны быть преобразованы в другое значение, проверьте возвращаемое значение DateTime.TryParse и, если оно ложно, установите значение явно. - person Palec; 31.05.2017
comment
Использование DateTime? (DateTime может принимать значение NULL) - person Kiquenet; 10.06.2017

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

person eyaler    schedule 22.07.2011
comment
Но TryParse возвращает true или false? Вот как вы узнаете, было ли оно действительным. - person Paul Draper; 20.04.2013