Проаналізуйте v. TryParse


111

Яка різниця між Parse () та TryParse ()?

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

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

Чи існує якась форма перевірки помилок, як блок "Try-Catch"?

Відповіді:


155

Parseвикидає виняток, якщо він не може проаналізувати значення, тоді як TryParseповертає boolвказівку, чи вдалось це зробити.

TryParseне просто try/ catchвнутрішньо - вся суть у тому, що вона реалізується без винятків, щоб вона була швидкою. Насправді спосіб, який він, найімовірніше, реалізується - це те, що внутрішньо Parseметод зателефонує TryParseта викине виняток, якщо він повернеться false.

Коротше кажучи, використовуйте, Parseякщо ви впевнені, що значення буде дійсним; в іншому випадку використовувати TryParse.


1
"внутрішньо метод Parse викликає TryParse" За винятком того, що Parse попередньо датує TryParse кількома версіями. Звичайно, вони могли перенести основну реалізацію на TryParse ...
Joel Coehoorn,

4
@Joel - Я припускав, що вони перенесли б реалізацію, але я просто подивився з рефлектором, і вони є окремими реалізаціями з точно таким же кодом, окрім одного, який має "кинути ...", а один має "повернути помилкове". Цікаво, чому вони не консолідуються ?!
Грег Бук

6
Хоча, думаючи про це, Парс викидає ряд різних винятків, тому якби все це було булом від TryParse, то воно не знатиме, кого кинути.
Грег Бук

5
"використовувати Аналіз, якщо ви впевнені, що значення буде дійсним". Я додам, "але ви визнаєте, що ви можете помилитися". Якщо ви були на 100% впевнені, що він може розібратися, то ви могли б так само правильно використовувати TryParse, який може бути швидшим.
Джон

2
І за "різними винятками" @GregBeech означає повідомлення, а не клас.
Пол Дрейпер

26

Якщо рядок неможливо перетворити на ціле число, то

  • int.Parse() викине виняток
  • int.TryParse() поверне помилковий (але не кине виняток)

Що робити, якщо я використовую int.TryParse (some_method_that_throws_exception (), out int test)? Чи вдасться зафіксувати якийсь виняток або лише ті, що стосуються розбору?
Олександру Анточі

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

3

Метод TryParse дозволяє перевірити, чи щось піддається синтаксичному аналізу. Якщо ви спробуєте Parse як у першому випадку з недійсним int, ви отримаєте виняток під час TryParse, він повертає булевий сигнал, повідомляючи вам про те, чи вдалося парса чи ні.

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


Перехід нуля до базових типів (int, double, DateTime тощо) НЕ буде кидати виняток
д-р Yunke

3

TryParse та податок на виняток

Синтаксичний аналіз видаляє виняток, якщо перетворення з рядка у вказаний тип даних не вдається, тоді як 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;
        }

Для c # найкращим варіантом є використання трипарсу, оскільки альтернатива 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 )
Кікенет

-1

подвійний.Чистий ("-"); збільшує виняток, тоді як double.TryParse ("-", розібраний); аналізує 0, тому я думаю, що TryParse робить більш складні перетворення.


4
Але TryParseповертається trueчи false? Ось як ви дізнаєтесь, чи було це "дійсно".
Пол Дрейпер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.