whats news new microsoft features docs compute c# datetime parsing string casting

news - C#Casting vs. Parse



new features c# (6)

Esto puede parecerle rudimentario a algunos, pero esta pregunta me ha estado fastidiando y, mientras escribo un código, supuse que lo haría.

¿Cuál de los siguientes es mejor código en c # y por qué?

((DateTime)g[0]["MyUntypedDateField"]).ToShortDateString()

o

DateTime.Parse(g[0]["MyUntypedDateField"].ToString()).ToShortDateString()

En última instancia, ¿es mejor emitir o analizar? ¡Gracias a todos!


Casting es la única buena respuesta.

Debe recordar que los resultados de ToString y Parse no siempre son exactos; existen casos en los que no puede realizar una ida y vuelta segura entre esas dos funciones.

La documentación de ToString dice que usa la configuración actual de la cultura del hilo. La documentación de Parse dice que también usa la configuración de la cultura de hilos actual (hasta ahora todo bien, están usando la misma cultura), pero hay una observación explícita que dice:

El formato está influenciado por las propiedades del objeto DateTimeFormatInfo actual, que de forma predeterminada se derivan del elemento Regional y Opciones de idioma en el Panel de control. Una razón por la que el método Parse puede lanzar inesperadamente FormatException es si las propiedades actuales DateTimeFormatInfo.DateSeparator y DateTimeFormatInfo.TimeSeparator tienen el mismo valor.

Entonces, dependiendo de la configuración de los usuarios, el código ToString / Parse puede fallar inesperadamente ...


Como @Brian R. Bondy señaló que depende de la implementación de g [0] ["MyUntypedDateField"] . La práctica segura es utilizar DateTime.TryParse y como operador.



Parse requiere una cadena de entrada, la conversión requiere un objeto, por lo tanto, en el segundo ejemplo que proporcione arriba, se le solicitará que realice dos conversiones: una de un objeto a una cadena, luego de una cadena a DateTime. El primero no.

Sin embargo, si existe el riesgo de una excepción al realizar el reparto, es posible que desee ir por la segunda ruta para poder probar y evitar una costosa excepción. De lo contrario, elija la ruta más eficiente y simplemente realice una conversión (desde el objeto hasta DateTime) en lugar de dos veces (desde el objeto hasta la cadena hasta DateTime).


Si g [0] ["MyUntypedDateField"] es realmente un objeto DateTime, entonces el elenco es la mejor opción. Si no es realmente un DateTime, entonces no tienes más remedio que usar el Parse (obtendrías una InvalidCastException si intentas usar el elenco)


Su código sugiere que la variable puede ser una fecha o una cadena que se parece a una fecha. Fechas puede simplemente regresar con un elenco, pero las cadenas deben ser analizadas. El análisis viene con dos advertencias;

  1. si no está seguro de que esta cadena se pueda analizar, utilice DateTime.TryParse() .

  2. Siempre incluya una referencia a la cultura que desea analizar como. ToShortDateString() devuelve diferentes salidas en diferentes lugares. Seguramente querrá analizar utilizando la misma cultura. Sugiero esta función que trata con ambas situaciones;

    private DateTime ParseDateTime(object data) { if (data is DateTime) { // already a date-time. return (DateTime)data; } else if (data is string) { // it''s a local-format string. string dateString = (string)data; DateTime parseResult; if (DateTime.TryParse(dateString, CultureInfo.CurrentCulture, DateTimeStyles.AssumeLocal, out parseResult)) { return parseResult; } else { throw new ArgumentOutOfRangeException("data", "could not parse this datetime:" + data); } } else { // it''s neither a DateTime or a string; that''s a problem. throw new ArgumentOutOfRangeException("data", "could not understand data of this type"); } }

Entonces llama así;

ParseDateTime(g[0]["MyUntypedDateField").ToShortDateString();

Tenga en cuenta que los datos incorrectos arrojan una excepción, por lo que querrá saberlo.

También; el operador ''como'' no funciona con el tipo de datos DateTime, ya que esto solo funciona con tipos de referencia, y DateTime es un tipo de valor.