Qu'est-ce qui ne va pas avec DateTime?Parse (myString)?
j'ai été la navigation Scott, Hanselman Interview des Développeurs question de liste, et couru à travers cette question:
Quel est le problème avec DateTime.Parse (myString)?
bien que je sache qu'il y a des risques inhérents à l'analyse d'une chaîne de format ou d'origine inconnue, y a-t-il d'autres raisons? Est-ce à utiliser DateTime.ParseExact à la place? Si ça devait être myString.ToString() en premier?
8 réponses
En outre, les paramètres régionaux de problème, DateTime.Parse()
pourrait également jeter une exception que vous auriez alors à attraper. Utilisez DateTime.TryParse()
ou DateTime.TryParseExact()
à la place.
utiliser la culture de thread actuelle sur le système est souvent une mauvaise idée, comme est "essayer une variété de formats, et voir si l'un d'eux fonctionne."
ParseExact avec une culture spécifique est beaucoup plus contrôlé et précis approche. (Même si vous spécifiez la culture actuelle, cela rend plus évident pour les lecteurs que c'est ce qui se passe.)
comme le dit MSDN:
parce que la méthode Parse(String) essaie pour analyser la représentation de chaîne de une date et une heure en utilisant le formatage les règles de la culture actuelle, en essayant pour séparer une corde particulière en travers différentes cultures peuvent échouer ou de retour des résultats différents. Si un la date et l'heure précises seront parsed à travers différents endroits, utilisez le type DateTime.Parse(String, IFormatProvider) ou l'une des méthodes surcharges de la Méthode ParseExact et fournir un spécificateur de format.
la question est juste pour voir si le développeur connaît les enjeux. Tout d'abord, vous devez utiliser TryParse parce que Parse jette une exception si elle est inégalable. En outre, il ne prend pas en compte locale donc dans un scénario web, si un utilisateur britannique types 02/10/2008, et mon serveur utilise une locale en-US, Je reçois février 10,2008 au lieu de Octobre 2, 2008.
il y a peut-être d'autres problèmes, mais ce sont les deux premiers qui viennent à l'esprit.
en plus de l'entrée d'utilisateur inconnue, l'environnement peut être inconnu.., donc je suppose que même si vous contrôlez le format d'entrée, ce que l'analyse attend peut être différent..
ma réaction viscérale va être que vous le frappez avec des formats/origines inconnus. Il peut y avoir d'autres raisons-par exemple, à partir de cette seule ligne, faites-nous myString
est une chaîne de caractères? (Je suis en supposant qu'elle est, bien sûr.)
généralement je recommande la méthode TryParse à la place. C'est un peu plus verbeux, mais aide à prévenir les exceptions -- aussi longtemps que votre code se comporte de manière appropriée dans le cas d'une entrée invalide.
bien sûr, basé sur votre formulation de ... Je suppose que vous le saviez déjà tout ça. :)
La réponse dépend du code qui entoure DateTime.Parse(myString) et les exigences de la parse
vous avez peut-être déjà vérifié que la chaîne est un format valide basé sur un regex et vous n'êtes peut-être pas intéressant dans L'Information de Culture. Vous pouvez également savoir que les données proviennent d'un format de fichier connu avec une convention de date connue de sorte que jeter une exception peut être exactement ce qui est désiré.
Sans contexte la question est ambiguë et la vraie réponse à il doit être "cela dépend du contexte dans lequel le code est utilisé quant à ce qui ne va pas avec lui, si un