Risposte:
Parse
genera un'eccezione se non è in grado di analizzare il valore, mentre TryParse
restituisce un che bool
indica se è riuscito.
TryParse
non solo try
/ catch
internamente - il punto centrale è che è implementato senza eccezioni in modo che sia veloce. In effetti, il modo in cui è molto probabilmente implementato è che internamente il Parse
metodo chiamerà TryParse
e quindi genererà un'eccezione se restituisce false
.
In poche parole, usa Parse
se sei sicuro che il valore sarà valido; altrimenti usa TryParse
.
Se la stringa non può essere convertita in un numero intero, allora
int.Parse()
genererà un'eccezioneint.TryParse()
restituirà false (ma non genererà un'eccezione)Il metodo TryParse ti consente di verificare se qualcosa è analizzabile. Se provi Parse come nella prima istanza con un int non valido, otterrai un'eccezione mentre nel TryParse, restituisce un valore booleano che ti consente di sapere se l'analisi è riuscita o meno.
Come nota a piè di pagina, il passaggio di null alla maggior parte dei metodi TryParse genererà un'eccezione.
TryParse e la tassa di eccezione
Parse genera un'eccezione se la conversione da una stringa al tipo di dati specificato non riesce, mentre TryParse evita esplicitamente di generare un'eccezione.
TryParse non restituisce il valore, restituisce un codice di stato per indicare se l'analisi è riuscita (e non genera un'eccezione).
Per la cronaca, sto testando due codici: quello cerca semplicemente di convertire da una stringa a un numero e se fallisce, assegna il numero a zero.
if (!Int32.TryParse(txt,out tmpint)) {
tmpint = 0;
}
e:
try {
tmpint = Convert.ToInt32(txt);
} catch (Exception) {
tmpint = 0;
}
Per c #, l'opzione migliore è usare tryparse perché l'alternativa try & Catch ha generato l'eccezione
A first chance exception of type 'System.FormatException' occurred in mscorlib.dll
Che è doloroso lento e indesiderabile, tuttavia, il codice non si ferma a meno che l'eccezione di Debug non venga risolta per interromperla.
So che è un post molto vecchio ma ho pensato di condividere alcuni dettagli in più su Parse vs TryParse.
Ho avuto uno scenario in cui DateTime deve essere convertito in String e se datevalue null o string.empty stavamo affrontando un'eccezione. Per ovviare a questo problema, abbiamo sostituito Parse con TryParse e otterremo la data predefinita.
Vecchio codice:
dTest[i].StartDate = DateTime.Parse(StartDate).ToString("MM/dd/yyyy");
dTest[i].EndDate = DateTime.Parse(EndDate).ToString("MM/dd/yyyy");
Nuovo codice:
DateTime startDate = default(DateTime);
DateTime endDate=default(DateTime);
DateTime.TryParse(dPolicyPaidHistories[i].StartDate, out startDate);
DateTime.TryParse(dPolicyPaidHistories[i].EndDate, out endDate);
Devo dichiarare un'altra variabile e usarla come Out per TryParse.
startDate
e, endDate
come DateTime.TryParse
sempre, sovrascriverli con DateTime.MinValue
. Se le rappresentazioni di data errate devono essere convertite in un valore diverso, controllare il valore restituito di DateTime.TryParse
e se è falso, impostare il valore in modo esplicito.
DateTime?
( DateTime nullable )
double.Parse ( "-"); solleva un'eccezione, mentre double.TryParse ("-", out parsed); analizza a 0 quindi immagino che TryParse esegua conversioni più complesse.
TryParse
ritorna true
o false
? È così che saprai se era "valido".