144 votes

Vérifier si une valeur a été attribuée à une variable DateTime.

Existe-t-il un moyen simple en C# de vérifier si une valeur a été attribuée ou non à une instance de DateTime ?

316voto

Hath Points 5505

Vous voulez dire comme ça :

DateTime datetime = new DateTime();

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

ou vous pouvez utiliser Nullable

DateTime? datetime = null;

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

5 votes

Seul le second est à l'épreuve des balles. La première suppose quelque chose à propos de la représentation non définie d'un DateTime qui n'est pas garanti par le framework. Personnellement, je pense qu'ils auraient dû ajouter un membre statique Unset pour ce scénario.

19 votes

Pour ajouter à ce que @RupertRawnsley a dit, vous devriez en fait comparer avec default(DateTime), qui est la valeur d'un DateTime non assigné. Il se trouve qu'elle est égale à MinValue, mais cela pourrait changer.

92voto

Jon Skeet Points 692016

La seule façon d'avoir une variable qui n'a pas été assignée à une valeur en C# est qu'il s'agisse d'une variable locale - dans ce cas, au moment de la compilation, vous pouvez dire qu'elle n'est pas définitivement assignée en essayant de la lire :)

Je soupçonne que vous voulez vraiment Nullable<DateTime> (ou DateTime? avec le sucre syntaxique du C#) - le rendre null pour commencer et ensuite assigner un DateTime (qui sera converti de manière appropriée). Ensuite, vous pouvez simplement comparer avec null (ou utilisez le HasValue ) pour voir si une "vraie" valeur a été définie.

1 votes

Comment vérifier si la valeur est égale à la valeur par défaut de la date. Y a-t-il un inconvénient notable à cette approche ? if(request.StartDateTime == default(DateTime) { request.StartDateTime = DateTime.Now ; }

9 votes

@Menol : Eh bien, cela ne fait pas la différence entre un champ auquel on a délibérément donné une valeur de default(DateTime) et une qui était déjà comme ça au départ. En fait, cela revient à traiter une valeur du domaine comme "spéciale et non disponible pour un usage normal", ce qui me déplaît.

0 votes

Pouvez-vous fournir un exemple de code ?

6voto

Arcturus Points 417

Je viens de découvrir que GetHashCode() pour une date non assignée est toujours zéro. Je ne suis pas sûr que ce soit une bonne façon de vérifier si une date est nulle, car je ne trouve aucune documentation sur la raison de ce comportement.

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

1 votes

GetHashCode renvoie 0 car les ticks (représentation interne de DateTime) sont également égaux à 0. Le code de hachage est calculé de la manière suivante : unchecked((int)ticks) ^ (int)(ticks >> 32); . Voir aussi ici : referencesource.microsoft.com/#mscorlib/system/datetime.cs,836

0 votes

Merci beaucoup. J'essaie de sérialiser un fichier XML à partir d'une classe C# et d'exclure les attributs nuls. Cela m'a aidé.

5voto

baretta Points 4391

Utilisez Nullable<DateTime> si possible.

5voto

TcKs Points 13249

DateTime est un type de valeur, donc il ne peut jamais être nul. Si vous pensez que DateTime ? ( Nullable ) vous pouvez utiliser :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X