2013-04-29 10 views
39

Ich muss einen DateTime Wert überprüfen, wenn es einen Wert hat oder nicht.Wie nach dem Standardwert DateTime Wert?

Ich habe mehrere Möglichkeiten:

if (dateTime == default(DateTime)) 

oder

if (dateTime == DateTime.MinValue) 

oder mit einem Nullable-DateTime?

if (nullableDateTime.HasValue) 

Persönlich würde ich die dritte Version bevorzugen, da seine ziemlich gut lesbar. Aber in unserer Datenbank haben wir einige Datetime-Spalten, die als nicht null definiert sind. Also in einigen Fällen muss ich mit den ersten beiden Optionen gehen.

Ich habe irgendwo gelesen, dass das Schlüsselwort default bei der Arbeit mit Generika verwendet werden sollte, aber ist es in diesem Fall nicht viel besser lesbar? Bei Verwendung der zweiten Option muss ich wissen, dass der Standardwert einer neuen und leeren DateTime-Instanz DateTime.MinValue ist, der den Geruch eines Implementierungsdetails für mich hat.

Also, welche Option sollte ich "best practice" zu benutzen?

+0

In Ihrem ersten Satz nach dem Code-Blöcke haben, meinen Sie das „zweite Version“, oder haben Sie „dritte Version“ bedeuten? –

+0

Aktualisiert;) Ich meinte die dritte Version, da die Eigenschaft klar erklärt, was ich zu prüfen beabsichtige: ob die Variable einen Wert hat – dasheddot

+0

Und was passiert, wenn was auch immer es tatsächlich ist, zu diesem minimalen Datum passiert? – Servy

Antwort

42

würde ich wahrscheinlich machen das wirklich eindeutig:

// Or private, or maybe even public 
internal static readonly DateTime MagicValueForNullDateTimeInNonNullableColumns 
    = DateTime.MinValue; 

Okay, also würde ich den Namen leicht weniger wortreich, aber Sie bekommen, was ich meine. Es ist nicht wirklich wichtig, wie Sie diesen Wert initialisieren - es ist klar, was Sie zu tun versuchen.

(Natürlich verwenden, um eine Nullable Type jederzeit Sie hierfür kann. Ich gehe davon aus die Frage gestellt wurde, weil man konnte nicht so tun, in bestimmten Situationen.)

+0

Für MY-Kontext (nicht in der Lage, Datenbank anzupassen, um Nullable datetime Spalten zu unterstützen) muss ich leider ohne Nullable gehen. Daher ist Ihr Vorschlag am annehmbarsten, denn dadurch, dass dies explizit gemacht wird, kann die Geschäftsregel hinter der Prüfung leichter realisiert werden. Ich werde diesen Weg gehen. Akzeptiert es, danke! – dasheddot

+2

@dasheddot: Ich würde auch diese Logik in Ihre Datenschicht und konvertieren in eine Nullable als geeignet, so dass Ihr Code überall sonst wird nice code verwenden und Sie müssen nur einmal die oben genannte Überprüfung einmal verwenden. – Chris

14

Ich muss Überprüfen Sie einen DateTime Wert, wenn es einen Wert hat oder nicht.

Sie haben die Lehrbuchsituation ziemlich beschrieben, die eine Nullable<DateTime> erfordert. Ich würde mit dieser Option gehen.

(Sie würden offensichtlich eine Art Übersetzungsebene benötigen, wenn Sie die Werte in einer Nicht-Null-DB-Spalte beibehalten möchten, aber ich würde versuchen, einen beliebigen "magischen" Wert so nahe wie möglich an der Datenbank zu halten. und versuchen Sie Ihren C# -Code sauber und idiomatisch zu halten.)

4

die „beste“ Praxis würde die Nullable-DateTime werden. Nullable Werttypen wurden genau für den Grund der nicht vertrauenswürdigen "magische" Zahlen erstellt.

Was ist am wichtigsten über diesen Ansatz ist seine Absicht - was bedeutet es in Ihrem Kontext zu einem "Standard" Datum/Uhrzeit?

+0

In meinem Zusammenhang würde es wirklich bedeuten, dass es kein Datum gab, das vom Benutzer definiert wurde, der von der Geschäftsregelsicht gültig ist. Also ich denke Nullable wäre am besten, aber leider kann ich die Datenbank nicht anpassen, was mich an die ersten beiden Versionen halten ließ. – dasheddot

0

Vielleicht können Sie einen Standardwert in Ihrer Datenbank mit getdate() gesetzt und dann alle Nullwerte aktualisieren Wert auf min oder was auch immer Sie mögen. Zumindest werden Sie eine Bedingung

Verwandte Themen