web-dev-qa-db-fra.com

Comment vérifier la valeur DateTime par défaut?

Je dois vérifier une valeur DateTime si elle a une valeur ou non.

J'ai plusieurs options:

if (dateTime == default(DateTime))

ou

if (dateTime == DateTime.MinValue)

ou en utilisant un nullable DateTime?

if (nullableDateTime.HasValue)

Personnellement, je préférerais la troisième version, car elle est très lisible. Mais dans notre base de données, nous avons des colonnes datetime qui sont définies comme non nulles. Donc, dans certains cas, je dois choisir les deux premières options.

J'ai lu quelque part que le mot clé default devrait être utilisé lorsque vous travaillez avec des génériques, mais n'est-il pas beaucoup plus lisible dans ce cas? Lors de l'utilisation de la deuxième option, je dois savoir que la valeur par défaut d'une instance DateTime nouvelle et vide est DateTime.MinValue, qui a pour moi l'odeur d'un détail d'implémentation.

Alors, quelle option dois-je utiliser pour utiliser les "meilleures pratiques"?

45
dasheddot

Je voudrais probablement rendre ceci très explicite:

// Or private, or maybe even public
internal static readonly DateTime MagicValueForNullDateTimeInNonNullableColumns
    = DateTime.MinValue;

Ok, alors je ferais le nom légèrement moins verbeux, mais vous obtenez ce que je veux dire. La manière dont vous initialisez cette valeur importe peu - il est clair ce que vous essayez de faire.

(Bien sûr, utilisez un type nullable chaque fois que vous le pouvez pour cela. Je suppose que la question a été posée car vous ne pouviez pas le faire dans certaines situations.)

51
Jon Skeet

Je dois vérifier une valeur DateTime si elle a une valeur ou non.

Vous avez à peu près décrit la situation des manuels nécessitant un Nullable<DateTime>. J'irais avec cette option.

(Vous auriez évidemment besoin d’une sorte de couche de traduction si vous deviez conserver les valeurs dans une colonne de base de données non nulle, mais j’essaierais de conserver une valeur "magique" aussi proche que possible de la base de données, et de garder cette valeur. votre code C # propre et idiomatique.)

16
LukeH

La "meilleure" pratique serait d'utiliser le nullable DateTime. Des types de valeur nullables ont été créés exactement pour cette raison de ne pas faire confiance aux nombres "magiques".

Le plus important de cette approche est son intention - que signifie-t-il signifie dans votre contexte pour avoir une date/heure "par défaut"?

6
Igal Tabachnik

Peut-être que vous pouvez définir une valeur par défaut dans votre base de données avec getdate (), puis mettre à jour toutes les valeurs null en valeur min ou à votre convenance. Au moins vous aurez une condition

0
Kuzgun