Pregunta

¿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?

¿Fue útil?

Solución

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

Otros consejos

El casting es el solo buena respuesta.

Debe recordar que los resultados de ToString y Parse no siempre son exactos; hay casos en los que no se puede realizar un viaje de ida y vuelta de forma segura entre esas dos funciones.

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

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

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

Su código sugiere que la variable puede ser una fecha o una cadena que parece una fecha.Las fechas se pueden devolver simplemente con un reparto, pero las cadenas deben analizarse.El análisis conlleva dos advertencias;

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

  2. Incluya siempre una referencia a la cultura que desea analizar. ToShortDateString() devuelve diferentes salidas en diferentes lugares.Es casi seguro que querrás analizar utilizando la misma cultura.Sugiero que esta función se ocupe de 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 generan una excepción, por lo que querrá detectarla.

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

Como @Brian R.Bondy señaló que depende de la implementación de g[0]["Mi campo de fecha sin tipo"].Una práctica segura es utilizar Fecha y hora.TryParse y como operador.

El análisis requiere una cadena como entrada, la conversión requiere un objeto, por lo que en el segundo ejemplo que proporciona arriba, debe realizar dos conversiones:uno de un objeto a una cadena, luego de una cadena a un DateTime.El primero no.

Sin embargo, si existe el riesgo de que se produzca una excepción al realizar la conversión, es posible que desee seguir la segunda ruta para poder probarParse y evitar que se lance una excepción costosa.De lo contrario, siga la ruta más eficiente y simplemente transmita una vez (del objeto a DateTime) en lugar de dos veces (del objeto a la cadena a DateTime).

Hay una comparación de las diferentes técnicas en http://blogs.msdn.com/bclteam/archive/2005/02/11/371436.aspx.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top