Czy istnieje łatwy sposób w C #, aby sprawdzić, czy wystąpieniu DateTime została przypisana wartość, czy nie?
132
Jedynym sposobem na posiadanie zmiennej, której nie przypisano wartości w C #, jest to, że jest ona zmienną lokalną - w takim przypadku w czasie kompilacji można stwierdzić, że nie jest ona ostatecznie przypisana, próbując odczytać z niej: )
Podejrzewam, że naprawdę chcesz Nullable<DateTime>
(lub DateTime?
z cukrem syntaktycznym C #) - null
zacznij od, a następnie przypisz normalną DateTime
wartość (która zostanie odpowiednio przekonwertowana). Następnie możesz po prostu porównać z null
(lub użyć HasValue
właściwości), aby sprawdzić, czy została ustawiona „rzeczywista” wartość.
default(DateTime)
. Zasadniczo traktuje jedną wartość w domenie jako „specjalną i niedostępną do normalnego użytku”, czego nie lubię.czy masz na myśli tak:
DateTime datetime = new DateTime(); if (datetime == DateTime.MinValue) { //unassigned }
lub możesz użyć Nullable
DateTime? datetime = null; if (!datetime.HasValue) { //unassigned }
źródło
umieść to gdzieś:
public static class DateTimeUtil //or whatever name { public static bool IsEmpty(this DateTime dateTime) { return dateTime == default(DateTime); } }
następnie:
DateTime datetime = ...; if (datetime.IsEmpty()) { //unassigned }
źródło
IsEmpty
metoda zwróci true, co prawdopodobnie nie jest to, co chcesz (bo to nie jest pusty - to przypisano wartość domyślna). Myślę, że nazwa twojej metody byłaby bardziej odpowiednia jakoIsDefaultValue
. Ponieważ tak naprawdę nie można mieć DateTime, która nie dopuszcza wartości nullIsEmpty
.IsDefaultValue
byłoby lepiejDateTime jest typem wartości, więc nie może nigdy mieć wartości null. Jeśli myślisz, że DateTime? (Nullable), którego możesz użyć:
DateTime? something = GetDateTime(); bool isNull = (something == null); bool isNull2 = !something.HasValue;
źródło
Właśnie się dowiedziałem, że GetHashCode () dla nieprzypisanej daty i godziny jest zawsze równe zero. Nie jestem pewien, czy jest to dobry sposób na sprawdzenie zerowej daty i godziny, ponieważ nie mogę znaleźć żadnej dokumentacji wyjaśniającej, dlaczego takie zachowanie jest wyświetlane.
if(dt.GetHashCode()==0) { Console.WriteLine("DateTime is unassigned"); }
źródło
GetHashCode
Zwraca 0, ponieważ kleszczy (wewnętrznej reprezentacji DateTime) są również równe 0. kod skrótu obliczonego przez następujący sposób:unchecked((int)ticks) ^ (int)(ticks >> 32);
. Zobacz także tutaj: referenceource.microsoft.com/#mscorlib/system/datetime.cs,836Użyj,
Nullable<DateTime>
jeśli to możliwe.źródło
Powiedziałbym, że wartością domyślną jest zawsze
new DateTime()
. Więc możemy pisaćDateTime datetime; if (datetime == new DateTime()) { //unassigned }
źródło
Generalnie wolę, jeśli to możliwe, używać domyślnych wartości typów wartości w celu określenia, czy zostały one ustawione. Oczywiście nie jest to możliwe przez cały czas, szczególnie w przypadku ints - ale w przypadku DateTimes myślę, że zarezerwowanie wartości MinValue w celu wskazania, że nie została zmieniona, jest wystarczająco sprawiedliwe. Zaletą tego w porównaniu z wartościami null jest to, że jest jedno miejsce mniej, w którym otrzymasz zerowy wyjątek odwołania (i prawdopodobnie wiele miejsc, w których nie musisz sprawdzać wartości null przed uzyskaniem do niego dostępu!)
źródło
Jeśli nie chcesz martwić się o problemy z wartością Null, takie jak sprawdzanie wartości null za każdym razem, gdy go używasz lub zawijanie go w jakąś logikę, a także nie chcesz martwić się o problemy z przesunięciem czasu, to jest to jak rozwiązałem problem:
startDate = startDate < DateTime.MinValue.AddDays(1) ? keepIt : resetIt
Po prostu sprawdzam, czy domyślna wartość jest mniejsza niż dzień po początku czasu. Działa jak marzenie.
źródło