Pergunta

Qual das alternativas a seguir é o melhor código em c# e por quê?

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

ou

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

Em última análise, é melhor transmitir ou analisar?

Foi útil?

Solução

Se g[0]["MyUntypedDateField"] for realmente um objeto DateTime, então a conversão é a melhor escolha.Se não for realmente um DateTime, então você não tem escolha a não ser usar o Parse (você obteria uma InvalidCastException se tentasse usar o cast)

Outras dicas

O elenco é o apenas boa resposta.

Você deve lembrar que os resultados de ToString e Parse nem sempre são exatos - há casos em que você não pode fazer uma viagem de ida e volta com segurança entre essas duas funções.

A documentação do ToString diz que ele usa as configurações atuais de cultura de thread.A documentação do Parse diz que ele também usa as configurações atuais de cultura de thread (até agora tudo bem - eles estão usando a mesma cultura), mas há uma observação explícita de que:

A formatação é influenciada pelas propriedades do objeto DateTimeFormatInfo atual, que por padrão são derivadas do item Opções Regionais e de Idioma no Painel de Controle. Um motivo pelo qual o método Parse pode gerar FormatException inesperadamente é se as propriedades DateTimeFormatInfo.DateSeparator e DateTimeFormatInfo.TimeSeparator atuais estiverem definidas com o mesmo valor.

Portanto, dependendo das configurações do usuário, o código ToString/Parse pode e irá falhar inesperadamente...

Seu código sugere que a variável pode ser uma data ou uma string que se parece com uma data.Datas que você pode simplesmente retornar com uma conversão, mas as strings devem ser analisadas.A análise vem com duas advertências;

  1. se você não tiver certeza de que esta string pode ser analisada, use DateTime.TryParse().

  2. Sempre inclua uma referência à cultura que você deseja analisar. ToShortDateString() retorna saídas diferentes em lugares diferentes.É quase certo que você desejará analisar usando a mesma cultura.Sugiro esta função lidando com ambas as situações;

    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");
        }
    }
    

Então ligue assim;

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

Observe que dados incorretos geram uma exceção, então você vai querer capturar isso.

Também;o operador 'as' não funciona com o tipo de dados DateTime, pois funciona apenas com tipos de referência, e DateTime é um tipo de valor.

Como @Brian R.Bondy apontou que depende da implementação de g[0]["MeuUntypedDateField"].A prática segura é usar DateTime.TryParse e como operador.

Parse requer uma string para entrada, a conversão requer um objeto, portanto, no segundo exemplo fornecido acima, você será obrigado a realizar duas conversões:um de um objeto para uma string e, em seguida, de uma string para um DateTime.O primeiro não.

No entanto, se houver o risco de uma exceção ao executar a conversão, convém seguir o segundo caminho para poder TryParse e evitar que uma exceção cara seja lançada.Caso contrário, siga o caminho mais eficiente e converta apenas uma vez (do objeto para DateTime) em vez de duas vezes (do objeto para string para DateTime).

Há comparação das diferentes técnicas em http://blogs.msdn.com/bclteam/archive/2005/02/11/371436.aspx.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top