Antworten:
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:
DateTime datetime = new DateTime();
if (datetime == DateTime.MinValue)
{
//unassigned
}
oder Sie könnten Nullable verwenden
DateTime? datetime = null;
if (!datetime.HasValue)
{
//unassigned
}
lege das irgendwo hin:
public static class DateTimeUtil //or whatever name
{
public static bool IsEmpty(this DateTime dateTime)
{
return dateTime == default(DateTime);
}
}
dann:
DateTime datetime = ...;
if (datetime.IsEmpty())
{
//unassigned
}
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 als IsDefaultValue
. Da kann man eigentlich keine nicht nullbare DateTime haben IsEmpty
.
IsDefaultValue
wäre besser gewesen
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.
if(dt.GetHashCode()==0)
{
Console.WriteLine("DateTime is unassigned");
}
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,836
Ich würde sagen, der Standardwert ist immer new DateTime()
. Also können wir schreiben
DateTime datetime;
if (datetime == new DateTime())
{
//unassigned
}
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!).
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:
startDate = startDate < DateTime.MinValue.AddDays(1) ? keepIt : resetIt
Ich überprüfe nur, ob der Standardwert weniger als einen Tag nach Beginn der Zeit liegt. Klappt wunderbar.