Parse v. TryParse

111

Jaka jest różnica między Parse () i TryParse ()?

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

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

Czy istnieje jakaś forma sprawdzania błędów, taka jak blok Try-Catch?

Kredns
źródło

Odpowiedzi:

155

Parsezgłasza wyjątek, jeśli nie może przeanalizować wartości, natomiast TryParsezwraca boolwskazanie, czy się powiodło.

TryParsenie tylko try/ catchwewnętrznie - chodzi o to, że jest wdrażany bez wyjątków, aby był szybki. W rzeczywistości najprawdopodobniej zaimplementowano ją w ten sposób, że wewnętrznie Parsemetoda wywoła, TryParsea następnie zgłosi wyjątek, jeśli zwróci false.

W skrócie, użyj, Parsejeśli masz pewność, że wartość będzie prawidłowa; inaczej użyj TryParse.

Greg Beech
źródło
1
„wewnętrznie metoda Parse wywoła TryParse” Z wyjątkiem tego, że Parse poprzedza TryParse przez kilka wersji. Oczywiście mogli przenieść podstawową implementację do TryParse ...
Joel Coehoorn
4
@Joel - założyłem, że przenieśliby implementację, ale właśnie spojrzałem z reflektorem i są to oddzielne implementacje z dokładnie tym samym kodem, innym niż jeden ma „throw ...” i „return false”. Zastanawiam się, dlaczego nie są skonsolidowane ?!
Greg Beech
6
Chociaż, myśląc o tym, Parse rzuca kilka różnych wyjątków, więc gdyby wszystko, co miał, było wartością bool z TryParse, nie wiedziałoby, który z nich rzucić.
Greg Beech
5
„użyj analizy, jeśli masz pewność, że wartość będzie prawidłowa”. Dodałbym: „ale zdajesz sobie sprawę, że możesz się mylić”. Gdybyś był w 100% pewien, że może analizować, możesz równie dobrze użyć TryParse, który może być szybszy.
Jon
2
A przez „różne wyjątki” @GregBeech oznacza wiadomość, a nie klasę.
Paul Draper,
26

Jeśli łańcucha nie można przekonwertować na liczbę całkowitą, to

  • int.Parse() zgłosi wyjątek
  • int.TryParse() zwróci false (ale nie zgłosi wyjątku)
M4N
źródło
Co jeśli użyję int.TryParse (some_method_that_throws_exception (), out int test)? Czy wykryje wyjątek, czy tylko te związane z analizowaniem?
Alexandru Antochi,
@AlexandruAntochi Nie powinieneś zadawać pytania jako komentarza. Dzięki temu inne osoby będą prawie niemożliwe, aby skorzystać z przydatnych odpowiedzi. Jednak aby było to warte twojego czasu, odpowiedź na twoje pytanie brzmi nie, int.TryParse w ogóle nie rzuci. Jeśli metoda nie uda się przeanalizować, będzie to odzwierciedlać tylko przez wartość zwracaną false. To sprawia, że ​​jest wygodny w użyciu if (int.TryParse…, aby zrobić coś tylko wtedy, gdy analiza się powiedzie.
Rob
3

Metoda TryParse umożliwia sprawdzenie, czy coś jest możliwe do przeanalizowania. Jeśli spróbujesz Parse, tak jak w pierwszej instancji, z nieprawidłową wartością int, otrzymasz wyjątek, podczas gdy w TryParse zwraca wartość logiczną, informującą, czy analiza powiodła się, czy nie.

Jako przypis, przekazanie wartości null do większości metod TryParse spowoduje zgłoszenie wyjątku.

Ray Booysen
źródło
Przekazanie wartości null do podstawowych typów (int, double, DateTime itp.) NIE spowoduje zgłoszenia wyjątku
Dr Yunke
3

TryParse i podatek od wyjątków

Parse zgłasza wyjątek, jeśli konwersja z ciągu na określony typ danych nie powiedzie się, podczas gdy TryParse jawnie unika zgłaszania wyjątku.

Gulzar Nazim
źródło
TryParse zgłosi wyjątek, jeśli przekażesz wartość null dla większości integralnych metod TryParse.
Ray Booysen
1
Świetny link. Dziwię się, że nikt nie rozpoczął jeszcze dyskusji „która z nich jest najlepsza lub jaką praktykę kodowania zastosować”.
Christian Madsen,
0

TryParse nie zwraca wartości, zwraca kod stanu wskazujący, czy analiza powiodła się (i nie zgłasza wyjątku).

Mark Brittingham
źródło
6
TryParse zwraca wartość poprzez parametr drugi, który jest określony za pomocą słowa kluczowego out.
Christian Madsen
0

Dla przypomnienia, testuję dwa kody: po prostu próbuję przekonwertować ciąg znaków na liczbę, a jeśli to się nie powiedzie, przypisuję liczbę do zera.

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

i:

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

W przypadku języka C # najlepszą opcją jest użycie tryparse, ponieważ metoda try & Catch alternatywa zgłosiła wyjątek

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

Że jest to bolesne, powolne i niepożądane, jednak kod nie zatrzymuje się, chyba że wyjątek Debug jest ustawiony na zatrzymanie.

magallanes
źródło
Pierwszy fragment kodu nic nie robi, ponieważ tmpint będzie już ustawiony na zero, jeśli ciąg nie może być przeanalizowany jako int.
Andrew Neely
0

Wiem, że to bardzo stary post, ale pomyślałem o udostępnieniu kilku dodatkowych szczegółów na temat Parse vs TryParse.

Miałem scenariusz, w którym DateTime należy przekonwertować na String i jeśli datevalue null lub string.empty napotkaliśmy wyjątek. Aby temu zaradzić, zastąpiliśmy Parse TryParse i otrzymamy domyślną datę.

Stary kod:

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

Nowy kod:

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

Muszę zadeklarować inną zmienną i użyć jako Out dla TryParse.

Życie Pi
źródło
Nie musisz inicjalizować startDatei endDatejak DateTime.TryParsezawsze nadpisać je DateTime.MinValue. Jeśli niepoprawne reprezentacje dat powinny zostać przekonwertowane na inną wartość, sprawdź zwracaną wartość, DateTime.TryParsea jeśli jest fałszywa, ustaw ją jawnie.
Palec
Używanie DateTime?( DateTime nullable )
Kiquenet
-1

double.Parse ("-"); zgłasza wyjątek, podczas gdy double.TryParse ("-", out parsed); analizuje do 0, więc myślę, że TryParse wykonuje bardziej złożone konwersje.

eyaler
źródło
4
Ale czy TryParsewraca trueczy false? W ten sposób dowiesz się, czy był „ważny”.
Paul Draper