2008-10-02 20 views
23

que era de la navegación de Scott Hanselman Developer Interview question list, y corrieron a través de esta pregunta: ¿¿Qué pasa con DateTime.Parse (myString)?

Lo que está mal con DateTime.Parse (miCadena)?

Si bien sé que existen riesgos inherentes al analizar una cadena de formato u origen desconocido, ¿hay otras razones? ¿Es usar DateTime.ParseExact en su lugar? ¿Debería ser myString.ToString() primero?

+0

Si cualquier persona interesada, que escribió un artículo sobre esta cuestión en turco como [DateTime.Parse (cadena) kullanmayı bırakamaz mıyız?] (http://sonergonul.net/datetime-parse-string-kullanmayi-birakamaz-miyiz/). –

Respuesta

26

Además, el problema de configuración regional, DateTime.Parse() también podría arrojar una excepción que luego tendría que atrapar. Use DateTime.TryParse() o DateTime.TryParseExact() en su lugar.

+7

TryParse/TryParseExact son excelentes para cuando los datos proceden de una fuente no confiable. Si tiene buenas razones para creer que los datos no válidos representan un error importante del sistema, no obstante, lanzar una excepción es lo correcto. No es una buena idea cambiar Universalmente Parse en TryParse. –

+0

wow joel, eres rápido y preciso como todos ¡formas! –

+1

Bueno, casi exacto-- Jon Skeet hace un buen punto. Sin embargo, estoy de acuerdo con mi respuesta: creo que hay muchos más casos en los que desea el comportamiento de TryParse(). –

0

esta entrada de blog explains it, pero lo general es que no hay culturalinfo asociado con el análisis.

14

El uso de la cultura de hilos actual en el sistema a menudo es una mala idea, ya que es "probar una variedad de formatos y ver si alguno de ellos funciona".

ParseExactuar con una cultura específica es un enfoque mucho más controlado y preciso. (Incluso si se especifica la cultura actual, se hace más evidente a los lectores de que eso es lo que está pasando.)

5

Como MSDN pone:

Debido a que el método Parse (String) intenta para analizar el cadena de representación de una fecha y hora utilizando las reglas de formato de de la cultura actual, intentando para analizar una cadena en particular a través de diferentes culturas pueden fallar o devolver resultados diferentes. Si un formato de fecha y hora específicas será analizada en diferentes lugares, utilizar método de la DateTime.Parse (String, IFormatProvider) o uno de los sobrecargas del método ParseExact y proporcionar un especificador de formato.

1

Además de la entrada del usuario desconoce el medio ambiente puede ser desconocida .., así que supongo que incluso si se controla el formato de entrada, lo que el análisis sintáctico espera puede ser diferente ..

3

Esa pregunta es sólo para ver si el desarrollador conoce los problemas con eso. Primero debe usar TryParse porque Parse arroja una excepción si no se puede leer. Tampoco tiene en cuenta la configuración regional, por lo que en un escenario web, si un usuario británico escribe el 02/10/2008 y mi servidor usa una configuración regional en-EE, obtengo el 10 de febrero de 2008 en lugar del 2 de octubre de 2008.

Puede haber otros problemas, pero esos son los dos primeros que se me ocurrieron.

1

Mi reacción visceral es que la golpeas con formatos/orígenes desconocidos. Puede haber otras razones, por ejemplo, a partir de esa línea única, ¿sabemos que myString es una cadena? (Supongo que lo es, por supuesto.)

En general, recomiendo el método TryParse en su lugar. Es un poco más detallado, pero ayuda a evitar excepciones, siempre y cuando el código se comporte adecuadamente en el caso de una entrada no válida.

Por supuesto, en función de su redacción a este ... supongo que ya lo sabía todo eso. :)

0

La respuesta depende del código que rodea DateTime.Parse (miCadena) y los requisitos del análisis sintáctico

Puede que ya tenga comprobar la cadena es un formato válido basado en una expresión regular y puede que no sea interesante en la información de la cultura. También puede saber que los datos provienen de un formato de archivo conocido con una convención de fecha conocida, por lo que arrojar una excepción puede ser exactamente lo que se desea.

Sin contexto, la pregunta es muy ambigua y la respuesta real a tiene que ser "depende del contexto en el que el código se utiliza en cuanto a lo que está mal con él, si un