Czy istnieje łatwy sposób w C #, aby sprawdzić, czy wystąpieniu DateTime została przypisana wartość, czy nie?
Odpowiedzi:
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
}
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
}
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 jako IsDefaultValue
. Ponieważ tak naprawdę nie można mieć DateTime, która nie dopuszcza wartości null IsEmpty
.
IsDefaultValue
byłoby lepiej
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");
}
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,836
Powiedziałbym, że wartością domyślną jest zawsze new DateTime()
. Więc możemy pisać
DateTime datetime;
if (datetime == new DateTime())
{
//unassigned
}
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!)
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.