web-dev-qa-db-fra.com

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

Existe-t-il un moyen simple dans C # de vérifier si une valeur a été affectée à une instance DateTime?

114
Moo

Le seul moyen d'avoir une variable à laquelle aucune valeur n'a été affectée en C # est de le considérer comme 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 suppose que vous voulez vraiment Nullable<DateTime> (ou DateTime? avec le sucre syntaxique C #) - créez null pour commencer, puis affectez une valeur normale DateTime (qui sera convertie en conséquence). Ensuite, vous pouvez simplement comparer avec null (ou utiliser la propriété HasValue) pour voir si une valeur "réelle" a été définie.

76
Jon Skeet

tu veux dire comme ça:

DateTime datetime = new DateTime();

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

ou vous pouvez utiliser Nullable

DateTime? datetime = null;

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

mettre ça quelque part:

public static class DateTimeUtil //or whatever name
{
    public static bool IsEmpty(this DateTime dateTime)
    {
        return dateTime == default(DateTime);
    }
}

ensuite:

DateTime datetime = ...;

if (datetime.IsEmpty())
{
    //unassigned
}
27
sonatique

Utilisation Nullable<DateTime> si possible.

5
baretta

Je viens de découvrir que GetHashCode () pour une date/heure non assignée est toujours zéro. Je ne suis pas sûr que ce soit un bon moyen de vérifier la date et l'heure null, car je ne trouve aucune documentation sur la raison pour laquelle ce comportement est affiché.

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

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

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

Je dirais que la valeur par défaut est toujours new DateTime(). Donc on peut écrire

DateTime datetime;

if (datetime == new DateTime())
{
    //unassigned
}
2
Sabine

Je préfère généralement, dans la mesure du possible, utiliser la valeur par défaut des types de valeur pour déterminer s'ils ont été définis. Cela n’est évidemment pas possible tout le temps, surtout avec ints - mais pour DateTimes, je pense que réserver la MinValue pour indiquer qu’elle n’a pas été modifiée est suffisant. L'avantage de ceci sur nullables est qu'il y a un endroit de moins où vous obtiendrez une exception de référence nulle (et probablement beaucoup d'endroits où vous n'avez pas à vérifier la valeur de null avant d'y accéder!)

0
Steve Dunn