Domanda

Quale dei seguenti è il codice migliore in C# e perché?

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

O

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

In definitiva, è meglio lanciare o analizzare?

È stato utile?

Soluzione

Se g[0]["MyUntypedDateField"] è davvero un oggetto DateTime, allora il cast è la scelta migliore.Se non è realmente un DateTime, non hai altra scelta che utilizzare Parse (otterresti un'eccezione InvalidCastException se provassi a utilizzare il cast)

Altri suggerimenti

Il casting è il soltanto buona risposta.

Devi ricordare che i risultati ToString e Parse non sono sempre esatti: ci sono casi in cui non è possibile andare avanti e indietro in sicurezza tra queste due funzioni.

La documentazione di ToString dice che utilizza le impostazioni attuali della cultura del thread.La documentazione di Parse dice che utilizza anche le attuali impostazioni della cultura del thread (finora tutto buono - usano la stessa cultura), ma c'è un'osservazione esplicita che:

La formattazione è influenzata dalle proprietà dell'oggetto DateTimeFormatInfo corrente, che per impostazione predefinita derivano dall'elemento Opzioni internazionali e della lingua nel Pannello di controllo. Uno dei motivi per cui il metodo Parse può generare in modo imprevisto FormatException è se le proprietà DateTimeFormatInfo.DateSeparator e DateTimeFormatInfo.TimeSeparator correnti sono impostate sullo stesso valore.

Pertanto, a seconda delle impostazioni dell'utente, il codice ToString/Parse può e fallirà inaspettatamente...

Il tuo codice suggerisce che la variabile può essere una data o una stringa che assomiglia a una data.Date che puoi semplicemente restituire con un cast, ma le stringhe devono essere analizzate.L'analisi viene fornita con due avvertimenti;

  1. se non sei sicuro che questa stringa possa essere analizzata, usa DateTime.TryParse().

  2. Includi sempre un riferimento alla cultura che desideri analizzare. ToShortDateString() restituisce output diversi in luoghi diversi.Quasi sicuramente vorrai analizzare utilizzando la stessa cultura.Suggerisco questa funzione che affronta entrambe le situazioni;

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

Allora chiama così;

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

Tieni presente che i dati errati generano un'eccezione, quindi ti consigliamo di rilevarlo.

Anche;l'operatore "as" non funziona con il tipo di dati DateTime, poiché funziona solo con i tipi di riferimento e DateTime è un tipo di valore.

Come @Brian R.Bondy ha sottolineato che dipende dall'implementazione di g[0]["Il mio campo data non tipizzato"].La pratica sicura è da usare DateTime.TryParse E COME operatore.

L'analisi richiede una stringa per l'input, il casting richiede un oggetto, quindi nel secondo esempio fornito sopra, devi eseguire due cast:uno da un oggetto a una stringa, quindi da una stringa a DateTime.Il primo no.

Tuttavia, se esiste il rischio di un'eccezione quando si esegue il cast, è possibile che si desideri seguire la seconda strada in modo da poter TryParse ed evitare la generazione di un'eccezione costosa.Altrimenti, segui il percorso più efficiente e lancia semplicemente una volta (dall'oggetto a DateTime) anziché due volte (dall'oggetto alla stringa a DateTime).

C'è un confronto tra le diverse tecniche su http://blogs.msdn.com/bclteam/archive/2005/02/11/371436.aspx.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top