Parse v. TryParse


111

Quelle est la différence entre Parse () et TryParse ()?

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

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

Existe-t-il une forme de vérification des erreurs comme un bloc Try-Catch?

Réponses:


155

Parselève une exception s'il ne peut pas analyser la valeur, alors que TryParseretourne un boolindiquant s'il a réussi.

TryParsene fonctionne pas seulement try/ en catchinterne - tout l'intérêt de celui-ci est qu'il est implémenté sans exceptions afin qu'il soit rapide. En fait, la manière la plus probable de l'implémenter est que la Parseméthode appellera en interne TryParsepuis lèvera une exception si elle retourne false.

En un mot, utilisez Parsesi vous êtes sûr que la valeur sera valide; sinon utilisez TryParse.


1
"En interne, la méthode Parse appellera TryParse" Sauf que Parse précède TryParse de plusieurs versions. Bien sûr, ils auraient pu déplacer l'implémentation principale vers TryParse ...
Joel Coehoorn

4
@Joel - J'ai supposé qu'ils auraient déplacé l'implémentation, mais j'ai juste jeté un coup d'oeil avec Reflector et ce sont des implémentations séparées avec exactement le même code autre que celui a 'throw ...' et l'autre a 'return false'. Je me demande pourquoi ils ne sont pas consolidés?!
Greg Beech

6
Bien que, en y réfléchissant, Parse lève un certain nombre d'exceptions différentes, donc si tout ce qu'il avait était un bool de TryParse, il ne saurait pas lequel lancer.
Greg Beech

5
"utilisez Parse si vous êtes sûr que la valeur sera valide". J'ajouterais, "mais vous reconnaissez la possibilité que vous vous trompiez". Si vous étiez sûr à 100% qu'il peut analyser, vous pouvez tout aussi bien utiliser TryParse qui pourrait être plus rapide.
Jon

2
Et par "différentes exceptions", @GregBeech signifie le message, pas la classe.
Paul Draper

26

Si la chaîne ne peut pas être convertie en entier, alors

  • int.Parse() lancera une exception
  • int.TryParse() retournera false (mais ne lèvera pas d'exception)

Et si j'utilise int.TryParse (some_method_that_throws_exception (), out test int)? Attrapera-t-il une exception ou uniquement celles liées à l'analyse?
Alexandru Antochi

@AlexandruAntochi Vous ne devriez pas poser de question en commentaire. Cela rendra presque impossible pour les autres de bénéficier de réponses utiles. Cependant, pour que cela en vaille la peine, la réponse à votre question est non, int.TryParse ne lancera pas du tout. Si l'analyse de la méthode échoue, elle ne reflétera cela que par une valeur de retour de false. Cela facilite l'utilisation de if (int.TryParse… pour ne faire quelque chose que si l'analyse réussit.
Rob

3

La méthode TryParse vous permet de tester si quelque chose est analysable. Si vous essayez Parse comme dans la première instance avec un int invalide, vous obtiendrez une exception pendant que dans TryParse, il retourne un booléen vous indiquant si l'analyse a réussi ou non.

En note de bas de page, la transmission de null à la plupart des méthodes TryParse lèvera une exception.


Passer null aux types de base (int, double, DateTime, etc.) ne
lèvera

3

TryParse et la taxe d'exception

Parse lève une exception si la conversion d'une chaîne vers le type de données spécifié échoue, alors que TryParse évite explicitement de lever une exception.


TryParse lèvera une exception si vous passez null pour la plupart des méthodes TryParse intégrales.
Ray Booysen le

1
Excellent lien. Je suis surpris que personne n'ait encore entamé la discussion «quelle est la meilleure méthode de codage ou quelle pratique de codage devrait être appliquée».
Christian Madsen

0

TryParse ne renvoie pas la valeur, il renvoie un code d'état pour indiquer si l'analyse a réussi (et ne lève pas d'exception).


6
TryParse renvoie la valeur via le paramètre deux qui est spécifié avec le mot clé out.
Christian Madsen le

0

Pour mémoire, je teste deux codes: qui essaient simplement de convertir une chaîne en un nombre et en cas d'échec, attribuez un numéro à zéro.

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

et:

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

Pour c #, la meilleure option est d'utiliser tryparse car l'alternative try & Catch a levé l'exception

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

Qu'il soit douloureux, lent et indésirable, cependant, le code ne s'arrête pas à moins que l'exception de Debug ne soit réglée pour s'arrêter avec lui.


Le premier extrait de code ne fait rien, car tmpint sera déjà mis à zéro si la chaîne ne peut pas être analysée comme un int.
Andrew Neely le

0

Je sais que c'est un très vieux post, mais j'ai pensé à partager quelques détails supplémentaires sur Parse vs TryParse.

J'ai eu un scénario dans lequel DateTime doit être convertie en String et si datevalue null ou string.empty nous étions confrontés à une exception. Afin de surmonter cela, nous avons remplacé Parse par TryParse et obtiendrons la date par défaut.

Ancien code:

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

Nouveau code:

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

Vous devez déclarer une autre variable et l'utiliser comme Out pour TryParse.


Vous n'avez pas besoin de les initialiser startDateet endDatecomme DateTime.TryParsecela les écrasera toujours avec DateTime.MinValue. Si des représentations de date incorrectes doivent être converties en une valeur différente, vérifiez la valeur de retour de DateTime.TryParseet si elle est fausse, définissez la valeur explicitement.
Palec

Utilisation de DateTime?( DateTime nullable )
Kiquenet

-1

double.Parse ("-"); lève une exception, tandis que double.TryParse ("-", out parsed); analyse à 0 donc je suppose que TryParse effectue des conversions plus complexes.


4
Mais TryParserevient-il trueou false? C'est ainsi que vous saurez s'il était "valide".
Paul Draper
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.