Parse v. TryParse


111

Qual è la differenza tra Parse () e TryParse ()?

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

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

Esiste una qualche forma di controllo degli errori come un blocco Try-Catch?

Risposte:


155

Parsegenera un'eccezione se non è in grado di analizzare il valore, mentre TryParserestituisce un che boolindica se è riuscito.

TryParsenon solo try/ catchinternamente - il punto centrale è che è implementato senza eccezioni in modo che sia veloce. In effetti, il modo in cui è molto probabilmente implementato è che internamente il Parsemetodo chiamerà TryParsee quindi genererà un'eccezione se restituisce false.

In poche parole, usa Parsese sei sicuro che il valore sarà valido; altrimenti usa TryParse.


1
"internamente il metodo Parse chiamerà TryParse" Tranne che Parse precede TryParse di diverse versioni. Ovviamente, avrebbero potuto spostare l'implementazione principale su TryParse ...
Joel Coehoorn,

4
@ Joel - pensavo che avrebbero spostato l'implementazione, ma ho appena dato un'occhiata con reflector e sono implementazioni separate con esattamente lo stesso codice diverso da uno che ha "throw ..." e uno ha "return false". Chissà perché non sono consolidati ?!
Greg Beech,

6
Sebbene, a pensarci bene, Parse genera una serie di eccezioni diverse, quindi se tutto ciò che aveva fosse un bool di TryParse non saprebbe quale lanciare.
Greg Beech

5
"usa Parse se sei sicuro che il valore sarà valido". Aggiungerei "ma riconosci la possibilità di sbagliarti". Se fossi sicuro al 100% che possa analizzare, potresti usare altrettanto correttamente TryParse, che potrebbe essere più veloce.
Jon,

2
E per "diverse eccezioni", @GregBeech indica il messaggio, non la classe.
Paul Draper

26

Se la stringa non può essere convertita in un numero intero, allora

  • int.Parse() genererà un'eccezione
  • int.TryParse() restituirà false (ma non genererà un'eccezione)

E se utilizzo int.TryParse (some_method_that_throws_exception (), out int test)? Catturerà qualche eccezione o solo quelle relative all'analisi?
Alexandru Antochi

@AlexandruAntochi Non dovresti fare una domanda come commento. Ciò renderà quasi impossibile per gli altri beneficiare di risposte utili. Tuttavia, per far sì che ne valga la pena, la risposta alla tua domanda è no, int.TryParse non lancerà affatto. Se il metodo non riesce ad analizzare, lo rifletterà solo con un valore restituito di false. Questo rende conveniente usare if (int.TryParse ... per fare qualcosa solo se l'analisi ha esito positivo.
Rob

3

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.


Passare null ai tipi di base (int, double, DateTime, ecc.) NON genererà un'eccezione
Dr Yunke

3

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 genererà un'eccezione se si passa null per la maggior parte dei metodi TryParse integrali.
Ray Booysen

1
Ottimo collegamento. Sono sorpreso che nessuno abbia ancora iniziato la discussione "quale sia la migliore o quale pratica di codifica dovrebbe essere applicata".
Christian Madsen

0

TryParse non restituisce il valore, restituisce un codice di stato per indicare se l'analisi è riuscita (e non genera un'eccezione).


6
TryParse restituisce il valore tramite il parametro due specificato con la parola chiave out.
Christian Madsen

0

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.


Il primo frammento di codice non fa nulla, poiché tmpint sarà già impostato a zero se la stringa non può essere analizzata come int.
Andrew Neely,

0

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.


Non è necessario inizializzarli startDatee, endDatecome DateTime.TryParsesempre, sovrascriverli con DateTime.MinValue. Se le rappresentazioni di data errate devono essere convertite in un valore diverso, controllare il valore restituito di DateTime.TryParsee se è falso, impostare il valore in modo esplicito.
Palec

Utilizzo di DateTime?( DateTime nullable )
Kiquenet

-1

double.Parse ( "-"); solleva un'eccezione, mentre double.TryParse ("-", out parsed); analizza a 0 quindi immagino che TryParse esegua conversioni più complesse.


4
Ma TryParseritorna trueo false? È così che saprai se era "valido".
Paul Draper
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.