Existe-t-il un moyen simple dans C # de vérifier si une instance de DateTime a reçu une valeur ou non?
Existe-t-il un moyen simple dans C # de vérifier si une instance de DateTime a reçu une valeur ou non?
Réponses:
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:
DateTime datetime = new DateTime();
if (datetime == DateTime.MinValue)
{
//unassigned
}
ou vous pouvez utiliser Nullable
DateTime? datetime = null;
if (!datetime.HasValue)
{
//unassigned
}
mettez ceci quelque part:
public static class DateTimeUtil //or whatever name
{
public static bool IsEmpty(this DateTime dateTime)
{
return dateTime == default(DateTime);
}
}
puis:
DateTime datetime = ...;
if (datetime.IsEmpty())
{
//unassigned
}
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é que IsDefaultValue
. Puisque vous ne pouvez pas vraiment avoir un DateTime non nullable IsEmpty
.
IsDefaultValue
aurait été mieux
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é.
if(dt.GetHashCode()==0)
{
Console.WriteLine("DateTime is unassigned");
}
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,836
Je dirais que la valeur par défaut est toujours new DateTime()
. Pour que nous puissions écrire
DateTime datetime;
if (datetime == new DateTime())
{
//unassigned
}
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!)
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:
startDate = startDate < DateTime.MinValue.AddDays(1) ? keepIt : resetIt
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.