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 #) - nullzacznij od, a następnie przypisz normalną DateTimewartość (która zostanie odpowiednio przekonwertowana). Następnie możesz po prostu porównać z null(lub użyć HasValuewł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
}
IsEmptymetoda 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.
IsDefaultValuebył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");
}
GetHashCodeZwraca 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.