Відповіді:
Parse
викидає виняток, якщо він не може проаналізувати значення, тоді як TryParse
повертає bool
вказівку, чи вдалось це зробити.
TryParse
не просто try
/ catch
внутрішньо - вся суть у тому, що вона реалізується без винятків, щоб вона була швидкою. Насправді спосіб, який він, найімовірніше, реалізується - це те, що внутрішньо Parse
метод зателефонує TryParse
та викине виняток, якщо він повернеться false
.
Коротше кажучи, використовуйте, Parse
якщо ви впевнені, що значення буде дійсним; в іншому випадку використовувати TryParse
.
Якщо рядок неможливо перетворити на ціле число, то
int.Parse()
викине винятокint.TryParse()
поверне помилковий (але не кине виняток)Метод TryParse дозволяє перевірити, чи щось піддається синтаксичному аналізу. Якщо ви спробуєте Parse як у першому випадку з недійсним int, ви отримаєте виняток під час TryParse, він повертає булевий сигнал, повідомляючи вам про те, чи вдалося парса чи ні.
Як виноска, перехід у нульове значення для більшості методів TryParse призведе до виключення.
TryParse та податок на виняток
Синтаксичний аналіз видаляє виняток, якщо перетворення з рядка у вказаний тип даних не вдається, тоді як TryParse явно уникає викидання виключення.
TryParse не повертає значення, він повертає код статусу, щоб вказати, чи вдалося аналізувати (і не кидає виняток).
Для запису я тестую два коди: Це просто спробуйте перетворити з рядка в число, а якщо воно не вдалося, то призначте число нулю.
if (!Int32.TryParse(txt,out tmpint)) {
tmpint = 0;
}
і:
try {
tmpint = Convert.ToInt32(txt);
} catch (Exception) {
tmpint = 0;
}
Для c # найкращим варіантом є використання трипарсу, оскільки альтернатива try & Catch є винятком
A first chance exception of type 'System.FormatException' occurred in mscorlib.dll
Що болісно повільно і небажано, однак, код не припиняється, якщо виключення Debug не вирішено для зупинки з ним.
Я знаю, що це дуже старий пост, але я подумав поділитися ще декількома деталями про 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 )
подвійний.Чистий ("-"); збільшує виняток, тоді як double.TryParse ("-", розібраний); аналізує 0, тому я думаю, що TryParse робить більш складні перетворення.
TryParse
повертається true
чи false
? Ось як ви дізнаєтесь, чи було це "дійсно".