2010-01-27 10 views
11

Gdybym miał DateTime na klasę o nazwie „TimeLastAccessed”, to więcej sensu dla tego DateTime być pustych:Czy lepiej jest użyć DateTime.MinValue lub null daty DateTime?

public DateTime? TimeLastAccessed { get; set } 

if (TimeLastAccessed == null) // ... handle it 

, aby wskazać, że nigdy obejrzano lub sprawdzić DateTime.MinValue

public DateTime TimeLastAccessed { get; set; } 

if (TimeLastAccessed == DateTime.MinValue) // ... handle it 

?

+1

Albo powinien TimeLastAccessed przez zestaw do TimeCreated gdy obiekt jest początkowo stworzony – benPearce

Odpowiedz

12

Bardziej sensowne jest używanie Nullable. Taki jest pomysł Nullable - wyrażenie, że typ wartości nie ma poprawnej wartości. Aby użyć MinValue jest łatką dla przypadków, w których nie masz Nullable.

+0

To także zbyt magia. Co jeśli ktoś chciałby wyrazić DateTime.MinValue, to byłoby to zignorowane. – Ian

0

Jak można uzyskać dostęp do czegoś, co istnieje? Czy twoja własność jest naprawdę czymś na liście LastAccessDateByCustomerOrClient?

W twoim przypadku myślę, że chcesz ... HasValue zamiast == null w teście. Jeśli zamierzasz korzystać z zajęć, wykorzystaj w pełni jego funkcje. Prawdopodobnie kompiluje się do prawie tego samego kodu, ale ...

6

Zgadzam się, że Nullable < DateTime> jest lepszym wyborem w przypadku braku innych względów.

Należy jednak wziąć pod uwagę inne systemy, z którymi należy współpracować.

Na przykład:

  • jeśli wystawiania .NET DateTime do klientów COM, nie będzie w stanie wykorzystać Nullable < DateTime>.

  • jeśli przechowujesz wartość w bazie danych SQL Server, pamiętaj, że SQL Server nie może przechowywać DateTime.MinValue jako DateTime.

Inną kwestią do rozważenia jest to, że Nullable można dodać trochę złożoności dla dzwoniących z API: mogą wziąć pod uwagę w jaki sposób sprawa zerowy powinien być traktowany. W niektórych przypadkach może być łatwiejsze użycie wartości domyślnej dla przypadku zerowego. Na przykład rozważ klasę, która udostępnia właściwość "Data wygaśnięcia", gdzie wymagana jest wartość wskazująca, że ​​element nigdy nie wygasa.

Jednym ze sposobów jest użycie Nullable<DateTime> z wartością null oznaczającą "never expires". Alternatywnym podejściem jest użycie standardowego DateTime z DateTime.MaxValue reprezentującego "nigdy nie wygasa".

W tym przykładzie test „jest przedawniony” jest prostsze dla standardowej DateTime:

if (item.ExpiryDate <= DateTime.Today) ... 

niż dla Nullable<DateTime>:

if (item.ExpiryDate.HasValue && item.ExpiryDate <= DateTime.Today) ... 
+1

+1 dla serwera Sql Uwaga –

Powiązane problemy