2010-01-27 15 views
11

Se avessi un DateTime su una classe denominata "TimeLastAccessed", avrebbe più senso per questo DateTime sia annullabile:È meglio utilizzare DateTime.MinValue o un valore DateTime nullable?

public DateTime? TimeLastAccessed { get; set } 

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

per indicare che non è mai stata letta o controllare per DateTime.MinValue

public DateTime TimeLastAccessed { get; set; } 

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

?

+1

O dovrebbe TimeLastAccessed dal set di TimeCreated quando l'oggetto è inizialmente creato – benPearce

risposta

12

Ha più senso usare Nullable. Questa è l'idea di Nullable - per esprimere che un tipo di valore non ha valore valido. Per usare MinValue è una patch per i casi in cui non hai Nullable.

+0

È anche troppo magico. Cosa succede se qualcuno volesse esprimere DateTime.MinValue, quindi sarebbe ignorato. – Ian

0

In che modo è possibile accedere a qualcosa che non esiste? La tua proprietà è davvero qualcosa di lista LastAccessDateByCustomerOrClient?

E nel tuo caso penso che tu voglia ... HasValue invece di == null nel test. Se hai intenzione di usare la classe, usa le sue funzionalità al meglio. Probabilmente compila quasi lo stesso codice ma ...

6

Sono d'accordo che Nullable < DateTime> è una scelta migliore in assenza di altre considerazioni.

È tuttavia necessario considerare altri sistemi con cui è necessario interoperare.

Ad esempio:

  • se si sta esponendo il tuo DateTime NET per client COM, non sarà in grado di utilizzare Nullable < DateTime>.

  • se si memorizza il valore in un database SQL Server, ricordare che SQL Server non può memorizzare DateTime.MinValue come DateTime.

altro punto da considerare è che Annullabile può aggiungere una certa complessità per chiamate di un API: possono essere necessario considerare come il caso nulla deve essere maneggiato. In alcuni casi è possibile che utilizzi un valore predefinito per il caso nullo. Ad esempio, considera una classe che espone una proprietà "ExpiryDate", in cui è necessario un valore per indicare che l'elemento non scade mai.

Un approccio consiste nell'utilizzare un Nullable<DateTime> con un valore nullo che rappresenta "non scade mai". Un approccio alternativo consiste nell'usare un DateTime standard con DateTime.MaxValue che rappresenta "non scade mai".

In questo esempio, il test per "'scaduta" è più semplice per il DateTime di serie:

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

che per il Nullable<DateTime>:

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

+1 per la nota server Sql –

Problemi correlati