Odpowiedzi:
Parse
zgłasza wyjątek, jeśli nie może przeanalizować wartości, natomiast TryParse
zwraca bool
wskazanie, czy się powiodło.
TryParse
nie tylko try
/ catch
wewnę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 Parse
metoda wywoła, TryParse
a następnie zgłosi wyjątek, jeśli zwróci false
.
W skrócie, użyj, Parse
jeśli masz pewność, że wartość będzie prawidłowa; inaczej użyj TryParse
.
Jeśli łańcucha nie można przekonwertować na liczbę całkowitą, to
int.Parse()
zgłosi wyjątekint.TryParse()
zwróci false (ale nie zgłosi wyjątku)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.
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.
TryParse nie zwraca wartości, zwraca kod stanu wskazujący, czy analiza powiodła się (i nie zgłasza wyjątku).
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.
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.
startDate
i endDate
jak DateTime.TryParse
zawsze nadpisać je DateTime.MinValue
. Jeśli niepoprawne reprezentacje dat powinny zostać przekonwertowane na inną wartość, sprawdź zwracaną wartość, DateTime.TryParse
a jeśli jest fałszywa, ustaw ją jawnie.
DateTime?
( DateTime nullable )
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.
TryParse
wraca true
czy false
? W ten sposób dowiesz się, czy był „ważny”.