2009-01-22 3 views
91

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

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

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

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

ответ

129

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

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

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

+1

"внутренне метод Parse вызовет TryParse" За исключением того, что предварительные даты Parse TryParse несколько версий. Конечно, они могли перенести реализацию ядра на TryParse ... –

+4

@Joel - Я предположил, что они перенесли реализацию, но я просто посмотрел на отражатель, и они являются отдельными реализациями с * точно * тем же кодом, кроме у одного есть «бросок ...», и у одного есть «return false». Интересно, почему они не консолидируются ?! –

+5

Хотя, размышляя об этом, Парс бросает несколько разных исключений, поэтому, если все, что у него было, это bool от TryParse, тогда он не знал, какой из них нужно бросить. –

20

Если строка не может быть преобразована в целое число, то

  • int.Parse() сгенерирует исключение
  • int.TryParse() возвращает ложь (но не сгенерирует исключение)
3

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

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

0

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

+4

TryParse возвращает значение через параметр two, который указан с помощью ключевого слова out. –

+0

@Christian Madsen - Спасибо. –

2

TryParse and the Exception Tax

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

+0

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

+1

Отличная ссылка. Я удивлен, что никто еще не начал «обсуждение», которое лучше всего подходит или какая практика кодирования должна применяться ». –

-2

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

+4

Но 'TryParse' возвращает' true' или 'false'? Вот как вы узнаете, является ли это «действительным». –

0

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

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

и:

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

Для C#, лучший вариант заключается в использовании TryParse, потому что пытаются & Поймайте альтернатива брошено исключение

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

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

+0

Первый снимок кода ничего не делает, поскольку 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); 

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

+0

Вам не нужно инициализировать 'startDate' и' endDate' как ['DateTime.TryParse'] (https://msdn.microsoft.com/en-us/library/ch92fbc1 (v = vs.110) .aspx) всегда будет перезаписывать их 'DateTime.MinValue'. Если неверные представления даты должны быть преобразованы в другое значение, проверьте возвращаемое значение 'DateTime.TryParse', а если оно ложно, задайте значение явно. – Palec

+0

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