Question

Lequel des éléments suivants est le meilleur code en c # et pourquoi?

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

ou

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

En fin de compte, vaut-il mieux lancer ou analyser?

Était-ce utile?

La solution

Si g [0] ["MyUntypedDateField"] est vraiment un objet DateTime, la conversion est le meilleur choix. Si ce n'est pas vraiment une date et heure, vous n'avez pas d'autre choix que d'utiliser l'analyse (vous obtiendrez une exception InvalidCastException si vous essayez d'utiliser la distribution).

Autres conseils

La diffusion est la seule bonne réponse.

N'oubliez pas que les résultats de ToString et Parse ne sont pas toujours exacts. Dans certains cas, vous ne pouvez pas effectuer un aller-retour en toute sécurité entre ces deux fonctions.

La documentation de ToString indique qu'elle utilise les paramètres de culture de thread actuels. La documentation de Parse indique qu’elle utilise également les paramètres de culture de fil actuels (jusqu’à présent, tout va bien - ils utilisent la même culture), mais il existe une remarque explicite:

  

Le formatage dépend des propriétés de l'objet DateTimeFormatInfo actuel, qui sont dérivées par défaut de l'élément Options régionales et linguistiques du Panneau de configuration. L'une des raisons pour lesquelles la méthode Parse peut émettre FormatException de manière inattendue est si les propriétés DateTimeFormatInfo.DateSeparator et DateTimeFormatInfo.TimeSeparator actuelles sont définies sur la même valeur.

Donc, en fonction des paramètres de l'utilisateur, le code ToString / Parse peut échouer de manière inattendue ...

Votre code suggère que la variable peut être une date ou une chaîne qui ressemble à une date. Vous pouvez simplement renvoyer les dates avec un casting, mais les chaînes doivent être analysées. L'analyse syntaxique vient avec deux mises en garde;

  1. si vous n'êtes pas certain que cette chaîne peut être analysée, utilisez DateTime.TryParse () .

  2. Toujours inclure une référence à la culture que vous souhaitez analyser. ToShortDateString () renvoie différentes sorties à différents endroits. Vous voudrez presque certainement analyser en utilisant la même culture. Je suggère que cette fonction traite des deux situations;

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

Ensuite, appelez comme ceci;

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

Notez que les mauvaises données génèrent une exception, vous voudrez donc la récupérer.

Aussi; l'opérateur "en tant que" ne fonctionne pas avec le type de données DateTime, car il ne fonctionne qu'avec des types de référence et DateTime est un type de valeur.

Comme @Brian R. Bondy l'a souligné, cela dépend de la mise en oeuvre de g [0] ["MyUntypedDateField"] . Une pratique sûre consiste à utiliser les opérateurs DateTime.TryParse et en tant que .

Parse nécessite une chaîne pour la saisie, tandis que la conversion nécessite un objet. Ainsi, dans le deuxième exemple que vous donnez ci-dessus, vous devez effectuer deux transformations: l'une d'un objet à une chaîne, puis d'une chaîne à un DateTime. Le premier n'en a pas.

Cependant, s'il existe un risque d'exception lors de la conversion, vous voudrez peut-être choisir la deuxième route afin d'essayer TryParse et éviter qu'une exception coûteuse ne soit générée. Sinon, choisissez la route la plus efficace et lancez juste une fois (d'objet à DateTime) plutôt que deux fois (d'objet à chaîne en DateTime).

Il existe une comparaison des différentes techniques à l'adresse http: // blogs.msdn.com/bclteam/archive/2005/02/11/371436.aspx .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top