2008-11-20 19 views

Odpowiedz

57

Jedynym sposobem na posiadanie zmiennej, której nie przypisano wartości w C#, jest jej zmienna lokalna - w tym przypadku w czasie kompilacji można stwierdzić, że nie jest ona definitywnie przypisana przez próbę odczytać z niego :)

podejrzewam naprawdę chcesz Nullable<DateTime> (lub DateTime? z cukrem składniowej C#) - sprawiają, że null zacząć, a następnie przypisać wartość normalną DateTime (które zostaną zamienione odpowiednio). Następnie można po prostu porównać z null (lub użyć właściwości HasValue), aby sprawdzić, czy została ustawiona "prawdziwa" wartość.

+0

jak o sprawdzenie, czy wartość jest równa wartości domyślnej datetime. Czy istnieje jakieś niezauważalne wady tego podejścia? if (request.StartDateTime == default (DateTime) {request.StartDateTime = DateTime.Now;} – Menol

+6

@Menol: To nie odróżnia pola, któremu celowo nadano wartość 'default (DateTime) 'i jeden, który był właśnie w ten sposób na początek.Zasadniczo traktuje jedną wartość w domenie jako" specjalne i niedostępne do normalnego użytkowania ", które nie lubię –

5

Użyj Nullable<DateTime>, jeśli to możliwe.

4

DateTime jest typem wartości, więc nie może nigdy mieć wartości NULL. Jeśli uważasz, że DateTime? (Nullable) można użyć:

DateTime? something = GetDateTime(); 
bool isNull = (something == null); 
bool isNull2 = !something.HasValue; 
220

masz na myśli tak:

DateTime datetime = new DateTime(); 

if (datetime == DateTime.MinValue) 
{ 
    //unassigned 
} 

lub można używać pustych

DateTime? datetime = null; 

if (!datetime.HasValue) 
{ 
    //unassigned 
} 
+4

Tylko druga z nich jest kuloodporne. Pierwsze zakłada coś o unset reprezentacja DateTime, które nie jest gwarantowane przez framework.My osobiście myślę, że powinny one zostały dodane Unset statyczny członek dla tego scenariusza. –

+10

Aby dodać, co powiedział @RupertRawnsley, powinieneś porównać z wartością domyślną (DateTime), która jest wartością nieprzypisanego obiektu DateTime. Tak się składa, że ​​jest równa wartości MinValue, ale może się zmienić. –

0

ja generalnie wolę, gdzie jest to możliwe, aby korzystać z domyślnego wartość typów wartości, aby określić, czy zostały ustawione. To oczywiście nie jest możliwe cały czas, szczególnie z ints - ale dla DateTimes, myślę, że zarezerwowanie MinValue do oznaczenia, że ​​nie zostało zmienione, jest sprawiedliwe. Zaletą tej sytuacji jest to, że istnieje jedno miejsce, w którym uzyskasz zerowy wyjątek odwołania (i prawdopodobnie wiele miejsc, w których nie musisz sprawdzać wartości zerowej przed uzyskaniem dostępu do niej!)

4

Właśnie się dowiedziałem że GetHashCode() dla nieprzypisanej daty i godziny jest zawsze zero. Nie jestem pewien, czy jest to dobry sposób na sprawdzenie zerowej datetime, ponieważ, nie mogę znaleźć dokumentacji na temat przyczyny tego zachowania.

if(dt.GetHashCode()==0) 
{ 
    Console.WriteLine("DateTime is unassigned"); 
} 
+1

'GetHashCode' zwraca 0, ponieważ tyknięcia (wewnętrzna reprezentacja DateTime) są równe 0. Kod skrótu obliczany w następujący sposób:' niezaznaczone ((int) ticks)^(int) (ticks >> 32); '. Zobacz także: http://referencesource.microsoft.com/#mscorlib/system/datetime.cs,836 –

2

Powiedziałbym, że domyślną wartością jest zawsze new DateTime(). Tak więc możemy napisać

DateTime datetime; 

if (datetime == new DateTime()) 
{ 
    //unassigned 
} 
+1

To rozwiązanie zostało już przekazane przez firmę + Hath w 2008 roku i, jako + Rupert Rawnsley dodany jako komentarz, nie jest kuloodporne ... –

14

umieścić 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 
} 
Powiązane problemy