Existe-t-il un moyen simple dans C # de vérifier si une instance de DateTime a reçu une valeur ou non?
131
La seule façon d'avoir une variable à laquelle aucune valeur n'a été attribuée en C # est qu'elle soit une variable locale - auquel cas, au moment de la compilation, vous pouvez dire qu'elle n'est pas définitivement affectée en essayant de lire à partir d'elle: )
Je soupçonne que vous voulez vraiment Nullable<DateTime>
(ou DateTime?
avec le sucre syntaxique C #) - faites-le null
pour commencer, puis attribuez une DateTime
valeur normale (qui sera convertie de manière appropriée). Ensuite, vous pouvez simplement comparer avec null
(ou utiliser la HasValue
propriété) pour voir si une valeur "réelle" a été définie.
default(DateTime)
et un autre qui était juste comme ça au départ. En gros, il traite une valeur du domaine comme "spéciale et indisponible pour une utilisation normale", ce que je n'aime pas.voulez-vous dire comme ça:
ou vous pouvez utiliser Nullable
la source
mettez ceci quelque part:
puis:
la source
IsEmpty
méthode retournera true, ce qui n'est probablement pas ce que vous voudriez (car il n'est pas vide - la valeur par défaut lui a été attribuée). Je suppose que le nom de votre méthode serait plus adapté queIsDefaultValue
. Puisque vous ne pouvez pas vraiment avoir un DateTime non nullableIsEmpty
.IsDefaultValue
aurait été mieuxDateTime est un type valeur, il ne peut donc jamais être nul. Si vous pensez à DateTime? (Nullable) vous pouvez utiliser:
la source
Je viens de découvrir que GetHashCode () pour une date / heure non attribuée est toujours zéro. Je ne suis pas sûr que ce soit un bon moyen de vérifier la date / heure nulle, car je ne trouve aucune documentation sur la raison pour laquelle ce comportement est affiché.
la source
GetHashCode
0 rendements en raison de tiques (de représentation interne de DateTime) sont aussi égaux à 0. code de hachage calculé par la façon suivante:unchecked((int)ticks) ^ (int)(ticks >> 32);
. Voir aussi ici: referencesource.microsoft.com/#mscorlib/system/datetime.cs,836Utilisez
Nullable<DateTime>
si possible.la source
Je dirais que la valeur par défaut est toujours
new DateTime()
. Pour que nous puissions écrirela source
Je préfère généralement, lorsque cela est possible, utiliser la valeur par défaut des types valeur pour déterminer s'ils ont été définis. Ce n'est évidemment pas possible tout le temps, en particulier avec ints - mais pour DateTimes, je pense que réserver la MinValue pour signifier qu'elle n'a pas été modifiée est assez juste. L'avantage de ceci par rapport aux nullables est qu'il y a un endroit en moins où vous obtiendrez une exception de référence nulle (et probablement beaucoup d'endroits où vous n'avez pas à vérifier null avant d'y accéder!)
la source
Si vous ne voulez pas avoir à vous soucier des problèmes de valeur Null comme la vérification de la valeur null à chaque fois que vous l'utilisez ou de l'encapsuler dans une logique, et que vous ne voulez pas non plus avoir à vous soucier des problèmes de temps de décalage, alors c'est comment j'ai résolu le problème:
Je vérifie juste que la valeur par défaut est inférieure à un jour après le début de l'heure. Fonctionne comme un charme.
la source