Frage

Welche der folgenden ist besser Code in C # und warum?

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

oder

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

Schließlich ist es besser, zu werfen oder zu analysieren?

War es hilfreich?

Lösung

Wenn g [0] [ „MyUntypedDateField“] ist wirklich ein Datetime-Objekt, dann die Besetzung die bessere Wahl ist. Wenn es nicht wirklich ein Datetime ist, dann haben Sie keine andere Wahl, als die Parse zu verwenden (Sie würden eine InvalidCastException, wenn man die Besetzung zu verwenden versucht)

Andere Tipps

Casting ist die nur gute Antwort.

Sie müssen bedenken, dass ToString und Parse Ergebnisse sind nicht immer genau - es gibt Fälle, wenn Sie nicht sicher zwischen diesen beiden Funktionen können Roundtrip

.

Die Dokumentation von ToString sagt, es aktuelle Thread Kultureinstellungen verwendet. Die Dokumentation von Parse sagt, es auch aktuellen Thread Kultureinstellungen verwendet (so weit, so gut - sie die gleiche Kultur verwenden), aber es ist eine explizite Bemerkung, dass:

  

Die Formatierung wird durch die Eigenschaften des aktuellen Datetime Objekts beeinflusst, die standardmäßig abgeleitet wird aus dem Regions- und Sprachoptionen in der Systemsteuerung. Ein Grund die Parse-Methode kann unerwartet Format werfen, wenn die aktuellen DateTimeFormatInfo.DateSeparator und DateTimeFormatInfo.TimeSeparator Eigenschaften auf den gleichen Wert eingestellt sind.

So, je nach Benutzer-Einstellungen, die ToString / Parse-Code kann und wird unerwartet ausfallen ...

Der Code legt nahe, dass der Variable entweder ein Datum oder eine Zeichenfolge sein kann, der wie ein Datum aussieht. Termine können Sie einfach wit eine Besetzung zurück, aber Strings müssen analysiert werden. Parsing kommt mit zwei Einsprüche;

  1. Wenn Sie nicht sicher sind, können diese Zeichenfolge analysiert werden, dann DateTime.TryParse() verwenden.

  2. sind immer einen Verweis auf die Kultur, die Sie wie analysieren möchten. ToShortDateString() gibt verschiedene Ausgänge an verschiedenen Orten. Sie wollen an Sicherheit grenzender Wahrscheinlichkeit mit der gleichen Kultur zu analysieren. Ich schlage vor, diese Funktion mit beiden Situationen zu tun;

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

Dann wie folgt aufrufen;

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

Beachten Sie, dass fehlerhafte Daten eine Ausnahme auslöst, so dass Sie, dass fangen wollen.

Auch; das ‚als‘ Operator funktioniert nicht mit dem Datetime-Datentyp, da dies nur mit Referenztypen funktioniert, und Datetime ist ein Werttyp.

Wie @ Brian R. Bondy darauf kommt es auf die Umsetzung von g [0] [ "MyUntypedDateField"] . Sichere Praxis ist die Verwendung DateTime.TryParse und wie Betreiber.

Parst eine Zeichenfolge für eine Eingabe erfordert, Gießen erfordert ein Objekt, so in dem zweiten Beispiel, das Sie oben bieten, dann sind Sie verpflichtet, zwei Würfe ausführen: ein von einem Objekt in einen String, dann aus einem String in einen Datetime. Die erste nicht.

Allerdings, wenn die Gefahr einer Ausnahme ist, wenn Sie die Besetzung durchführen, dann möchten Sie vielleicht die zweite Strecke gehen, so können Sie eine teure Ausnahme geworfen werden TryParse und vermeiden. Andernfalls geht die effizienteste Route und nur einmal werfen (von Objekt zu Datetime) anstatt zweimal (von Objekt zu String Datetime).

Es gibt Vergleich der verschiedenen Techniken unter http: // blogs.msdn.com/bclteam/archive/2005/02/11/371436.aspx .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top