2010-03-16 7 views
10

Wenn immer SQL Datetime ReSharper schlägt new DateTime() zu verwenden, wenn Wert DBNull.Value ist. Ich habe immer DateTime.MinValue verwendet. Was ist der richtige Weg?DateTime.MinValue vs neue Datetime() in C#

DateTime varData = sqlQueryResult["Data"] is DateTime ? (DateTime) sqlQueryResult["Data"] : new DateTime(); 
+0

Vielen Dank allen . – MadBoy

Antwort

18

Von the documentation of DateTime.MinValue:

MinValue definiert das Datum und die Zeit, die zu einem nicht initialisierten Variable Datetime zugeordnet ist.

Somit wird das resultierende Datum gleich sein. Da DateTime ein Werttyp ist, sollten beide Optionen gleichwertig sein. Persönlich bevorzuge ich es, DateTime.MinValue zu schreiben, da es selbstdokumentiert.

PS: Sie könnten die Verwendung von nullable types (DateTime?) in Betracht ziehen, wenn Ihre Daten (sinnvolle) Nullwerte enthalten können.

0

Es gibt keinen "richtigen" Weg. Es gibt eine Konvention, die Leute aufbauen und der das Team folgt.

DateTime.MinValue und new DateTime() sind gültige Definitionen für eine Null, wenn der verantwortliche Entwickler dies bestimmt.

1

Ich würde sagen, immer MinValue zu verwenden, denn dann wissen Sie genau, was Wert darin ist. Wenn Sie einfach newTime() verwenden, initialisieren Sie es so, dass es einen Wert enthält, aber nicht angibt, welchen Wert es einfügen soll. Es ist auch viel sauberer und klarer, explizit darauf hinzuweisen.

+1

new DateTime() setzt es tatsächlich auf einen Wert. Es ist im Grunde "default (DateTime)", das basierend auf den Regeln zum Erstellen eines Standardwerts für eine Struktur festgelegt wird. dh. legt Standardwerte für alle Mitglieder fest. – kervin

1

Standardwert von Datetime ist die DateTime.MinValue, so dass ich denke, es ist nicht, welche davon Sie egal verwenden;)

+1

[Zitat benötigt] –

2

Normalerweise würde ich den NULL Fall explizit behandeln. Etwas in diese Richtung:

if (!sqlQueryResults.IsNull("Data")) 
    DoComputationDependantOnDateTime((DateTime) sqlQueryResults["Data"]); 

In einigen Fällen kann es sinnvoll sein, die Logik auch dann auszuführen, wenn keine Daten vorhanden sind. In solchen Fällen wissen nur Sie, von welchem ​​Standardwert aus gestartet werden soll. Mögliche Kandidaten:

  • DateTime.MinValue
  • DateTime.MaxValue
  • DateTime.Now

Ich würde nie new DateTime() verwenden, da es sehr schlecht Lesbarkeit hat. Was gibt diese Aussage zurück? Sie (und zukünftige Entwickler des Projekts) müssen möglicherweise in die Dokumentation schauen, um herauszufinden, wofür der Wert initialisiert wird.

0

Der am meisten wartbare Weg zur Darstellung eines Nullwerts wäre die Verwendung eines Nullable<DateTime>, d. H. DateTime?. Auf diese Weise wird der Nullwert eindeutig als ein Nicht-Wert anstelle eines magischen Werts dargestellt, der eine spezielle Behandlung benötigt.

(Der Nullwert braucht natürlich auch eine besondere Behandlung, aber es ist viel schwieriger zu übersehen.)

Wenn Sie einen magischen Wert verwenden NULL-Werte zu repräsentieren, kein Wert ist viel besser als jeder andere.Sie können DateTime.MinValue oder new DateTime() (die das gleiche Ergebnis liefern) verwenden, oder Sie können einen beliebigen Wert außerhalb des Bereichs verwenden, den Ihre Anwendung verwendet.

Ein Wert wie DateTime.MinValue hat einen leichten Vorteil, da sie bereits als eine Konstante, auf der anderen Seite definiert ist können Sie Ihre eigene Konstante definieren, die einen etwas besseren Namen hat, zum Beispiel:

public const DateTime DateThatMeansNull = new DateTime(1685, 3, 21); 
+0

Das wird nicht kompilieren - "Der Typ 'System.DateTime' kann nicht const" – Ryan