Parse v. TryParse


111

Was ist der Unterschied zwischen Parse () und TryParse ()?

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

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

Gibt es eine Form der Fehlerprüfung wie einen Try-Catch-Block?

Antworten:


155

ParseLöst eine Ausnahme aus, wenn der Wert nicht analysiert werden kann, während eine TryParseRückgabe zurückgegeben wird, die boolangibt, ob dies erfolgreich war.

TryParsenicht nur try/ catchintern - der springende Punkt ist, dass es ohne Ausnahmen implementiert wird, so dass es schnell ist. Tatsächlich wird es höchstwahrscheinlich so implementiert, dass die ParseMethode intern TryParseeine Ausnahme aufruft und dann auslöst, wenn sie zurückkehrt false.

Kurz gesagt, verwenden ParseSie diese Option, wenn Sie sicher sind, dass der Wert gültig ist. andernfalls verwenden TryParse.


1
"Intern ruft die Parse-Methode TryParse auf" Mit der Ausnahme, dass Parse TryParse um mehrere Versionen vorab datiert. Natürlich hätten sie die Kernimplementierung auf TryParse verschieben können ...
Joel Coehoorn

4
@Joel - Ich nahm an, dass sie die Implementierung verschoben hätten, aber ich habe nur einen Blick mit Reflektor geworfen und es handelt sich um separate Implementierungen mit genau demselben Code, außer dass einer "throw ..." und einer "return false" hat. Ich frage mich, warum sie nicht konsolidiert sind?!
Greg Beech

6
Wenn Parse darüber nachdenkt, gibt es eine Reihe verschiedener Ausnahmen. Wenn es also nur einen Bool von TryParse gäbe, würde es nicht wissen, welchen es werfen soll.
Greg Beech

5
"Verwenden Sie Parse, wenn Sie sicher sind, dass der Wert gültig ist". Ich würde hinzufügen, "aber Sie erkennen die Möglichkeit an, dass Sie falsch liegen könnten". Wenn Sie zu 100% sicher sind, dass es analysiert werden kann, können Sie TryParse genauso korrekt verwenden, was möglicherweise schneller ist.
Jon

2
Und mit "verschiedenen Ausnahmen" meint @GregBeech die Nachricht, nicht die Klasse.
Paul Draper

26

Wenn die Zeichenfolge nicht in eine Ganzzahl konvertiert werden kann, dann

  • int.Parse() wird eine Ausnahme auslösen
  • int.TryParse() wird false zurückgeben (aber keine Ausnahme auslösen)

Was ist, wenn ich int.TryParse (some_method_that_throws_exception (), out int test) verwende? Wird es eine Ausnahme geben oder nur diejenigen, die mit dem Parsen zusammenhängen?
Alexandru Antochi

@AlexandruAntochi Sie sollten eine Frage nicht als Kommentar stellen. Dies macht es für andere fast unmöglich, von nützlichen Antworten zu profitieren. Damit es sich jedoch lohnt, lautet die Antwort auf Ihre Frage "Nein". Int.TryParse wird überhaupt nicht werfen. Wenn die Methode nicht analysiert werden kann, wird dies nur durch den Rückgabewert false wiedergegeben. Dies macht es bequem, if (int.TryParse… zu verwenden, um nur etwas zu tun, wenn die Analyse erfolgreich ist.
Rob

3

Mit der TryParse-Methode können Sie testen, ob etwas analysierbar ist. Wenn Sie Parse wie in der ersten Instanz mit einem ungültigen int versuchen, wird eine Ausnahme angezeigt, während in TryParse ein Boolescher Wert zurückgegeben wird, der Sie darüber informiert, ob die Analyse erfolgreich war oder nicht.

Als Fußnote löst die Übergabe von null an die meisten TryParse-Methoden eine Ausnahme aus.


Das Übergeben von Null an Basistypen (int, double, DateTime usw.) löst KEINE Ausnahme aus
Dr. Yunke,

3

TryParse und die Ausnahmesteuer

Parse löst eine Ausnahme aus, wenn die Konvertierung von einer Zeichenfolge in den angegebenen Datentyp fehlschlägt, während TryParse das Auslösen einer Ausnahme explizit vermeidet.


TryParse löst eine Ausnahme aus, wenn Sie für die meisten integralen TryParse-Methoden null übergeben.
Ray Booysen

1
Toller Link. Ich bin überrascht, dass noch niemand mit der Diskussion "Welches ist das Beste oder welche Codierungspraxis sollte angewendet werden" begonnen hat.
Christian Madsen

0

TryParse gibt den Wert nicht zurück, sondern gibt einen Statuscode zurück, der angibt, ob die Analyse erfolgreich war (und keine Ausnahme auslöst).


6
TryParse gibt den Wert über Parameter zwei zurück, der mit dem Schlüsselwort out angegeben wird.
Christian Madsen

0

Für die Aufzeichnung teste ich zwei Codes: Diese versuchen einfach, von einer Zeichenfolge in eine Zahl umzuwandeln, und wenn dies fehlschlägt, weisen Sie die Zahl Null zu.

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

und:

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

Für c # ist die beste Option die Verwendung von tryparse, da die Alternative try & Catch die Ausnahme ausgelöst hat

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

Dass es schmerzhaft langsam und unerwünscht ist, hört der Code jedoch nicht auf, es sei denn, die Debug-Ausnahme ist damit verbunden, damit aufzuhören.


Das erste Code-Snippit macht nichts, da tmpint bereits auf Null gesetzt ist, wenn die Zeichenfolge nicht als int analysiert werden kann.
Andrew Neely

0

Ich weiß, dass es ein sehr alter Beitrag ist, dachte aber daran, ein paar weitere Details zu Parse vs TryParse zu teilen.

Ich hatte ein Szenario, in dem DateTime in String konvertiert werden muss und wenn datevalue null oder string.empty ist, hatten wir eine Ausnahme. Um dies zu überwinden, haben wir Parse durch TryParse ersetzt und erhalten das Standarddatum.

Alter Code:

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

Neuer Code:

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

Müssen eine andere Variable deklarieren und als Out für TryParse verwendet werden.


Sie müssen nicht initialisieren startDateund überschreiben sie endDatewie DateTime.TryParseimmer mit DateTime.MinValue. Wenn falsche Datumsdarstellungen in einen anderen Wert konvertiert werden sollen, überprüfen Sie den Rückgabewert von DateTime.TryParseund setzen Sie den Wert explizit, wenn er falsch ist.
Palec

Using DateTime?( DateTime nullable )
Kiquenet

-1

double.Parse ("-"); löst eine Ausnahme aus, während double.TryParse ("-", out parsed); wird auf 0 analysiert, also führt TryParse vermutlich komplexere Konvertierungen durch.


4
Aber kehrt TryParsezurück trueoder false? So wissen Sie, ob es "gültig" war.
Paul Draper
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.