Gibt es eine einfache Möglichkeit in C # zu überprüfen, ob einer DateTime-Instanz ein Wert zugewiesen wurde oder nicht?
131
Die einzige Möglichkeit, einer Variablen, der in C # kein Wert zugewiesen wurde, eine lokale Variable zuzuweisen, besteht darin, dass Sie beim Kompilieren feststellen können, dass sie nicht definitiv zugewiesen ist, indem Sie versuchen, daraus zu lesen: )
Ich vermute, Sie möchten wirklich Nullable<DateTime>
(oder DateTime?
mit dem syntaktischen C # -Zucker) - machen Sie es null
zunächst und weisen Sie dann einen normalen DateTime
Wert zu (der entsprechend konvertiert wird). Dann können Sie einfach mit vergleichen null
(oder die HasValue
Eigenschaft verwenden), um festzustellen, ob ein "realer" Wert festgelegt wurde.
default(DateTime)
und einem Feld, das genau so war. Grundsätzlich wird ein Wert innerhalb der Domain als "speziell und für den normalen Gebrauch nicht verfügbar" behandelt, was mir nicht gefällt.meinst du so:
oder Sie könnten Nullable verwenden
quelle
lege das irgendwo hin:
dann:
quelle
IsEmpty
Methode true zurück, was wahrscheinlich nicht das ist, was Sie möchten (da es nicht leer ist - ihm wurde der Standardwert zugewiesen). Ich denke, der Name Ihrer Methode wäre besser geeignet alsIsDefaultValue
. Da kann man eigentlich keine nicht nullbare DateTime habenIsEmpty
.IsDefaultValue
wäre besser gewesenDateTime ist ein Werttyp, daher kann er niemals null sein. Wenn Sie DateTime denken? (Nullable) können Sie verwenden:
quelle
Ich habe gerade herausgefunden, dass GetHashCode () für eine nicht zugewiesene Datumszeit immer Null ist. Ich bin nicht sicher, ob dies eine gute Möglichkeit ist, nach null datetime zu suchen, da ich keine Dokumentation dazu finden kann, warum dieses Verhalten angezeigt wird.
quelle
GetHashCode
Gibt 0 zurück, da Ticks (interne Darstellung von DateTime) ebenfalls gleich 0 sind. Hash-Code wird folgendermaßen berechnet :unchecked((int)ticks) ^ (int)(ticks >> 32);
. Siehe auch hier: referencesource.microsoft.com/#mscorlib/system/datetime.cs,836Verwenden Sie,
Nullable<DateTime>
wenn möglich.quelle
Ich würde sagen, der Standardwert ist immer
new DateTime()
. Also können wir schreibenquelle
Im Allgemeinen bevorzuge ich es, wenn möglich, den Standardwert von Werttypen zu verwenden, um festzustellen, ob sie festgelegt wurden. Dies ist natürlich nicht immer möglich, insbesondere bei Ints - aber für DateTimes halte ich es für fair genug, den MinValue zu reservieren, um anzuzeigen, dass er nicht geändert wurde. Dies hat gegenüber nullables den Vorteil, dass es eine Stelle weniger gibt, an der Sie eine Nullreferenzausnahme erhalten (und wahrscheinlich viele Stellen, an denen Sie vor dem Zugriff nicht auf null prüfen müssen!).
quelle
Wenn Sie sich nicht um Nullwertprobleme kümmern müssen, z. B. jedes Mal, wenn Sie es verwenden, nach Null suchen oder es in eine Logik einwickeln möchten, und Sie sich auch nicht um Probleme mit der Versatzzeit kümmern müssen, dann ist dies der Fall wie ich das Problem gelöst habe:
Ich überprüfe nur, ob der Standardwert weniger als einen Tag nach Beginn der Zeit liegt. Klappt wunderbar.
quelle