web-dev-qa-db-fra.com

Quelle devrait être la valeur par défaut dans un paramètre facultatif DateTime?

Normalement, si j'ai un type nullable pour un paramètre facultatif, je mettrais null comme valeur par défaut. De cette façon, je sais que si la valeur est null, l'appelant ne souhaite spécifier aucune valeur pour celle-ci. 

public void Foo(string text, string text2= null);

Si le paramètre est normalement un entier positif, je peux utiliser un nombre négatif

public void Foo(string text, int index=-1);

Que diriez-vous de DateTime? Ce n'est pas nul, et (autant que je sache), il n'a pas de nombre sans signification qui ne peut pas être une entrée vraie non plus (comme -1 pour un entier positif). Ou est-il? Qu'utiliseriez-vous dans cette situation?

Je sais aussi que je peux utiliser le type nullable DateTime, mais cela signifie que l'appelant de la méthode devra utiliser Nullable ainsi que l'opposé pour simplement passer un DateTime.

24
Louis Rhys

Vous pouvez rendre les types de valeur nullables à l'aide de l'opérateur ? en C #:

DateTime? myDate = null;

A partir de là, vous pouvez rendre le paramètre facultatif:

void Foo(DateTime? myDate = null)
{
}

Lectures supplémentaires sur les types nullables.

Ce n'est pas le seul moyen de paramétrer le chat, cependant, vous pouvez utiliser default(DateTime), cependant vous ne pouvez pas utiliser DateTime.MinValue, MaxValue ou Now dans des paramètres facultatifs car ils ne sont pas des constantes de temps de compilation.

Bien sûr, vous n'avez pas besoin d'utiliser des paramètres facultatifs, vous pouvez utiliser des méthodes surchargées si vous souhaitez utiliser Min, Max ou Now.

void Foo()
{
    Foo(DateTime.MinValue);
}

void Foo(DateTime d)
{
}

Si vous voulez exagérer (enfin, peut-être pas exagéré, de nombreuses raisons valables de le faire), vous pouvez définir un nouveau type de date qui comprend quand il a une valeur:

class SmarterDateTime
{
    public bool IsSet { get; set; }

    // Wrapper around DateTime etc excluded.
}

En ce qui concerne ce qui devrait être la valeur par défaut, vous pouvez choisir de définir n'importe quelle date comme valeur par défaut si vous le souhaitez, mais vous aurez des limites pour des paramètres tels que les paramètres facultatifs.

Personnellement, j'ai tendance à utiliser DateTime.MinValue.

32
Adam Houldsworth

default (DateTime) - l'opérateur default est destiné à It

15
Vasya

A la question "quelle peut être une valeur par défaut pour un DateTime", la réponse doit être: vous ne pouvez utiliser que default(DateTime). Ceci parce que la valeur par défaut doit être const et que DateTime.MinValue et DateTime.MaxValue sont uniquement static readonly, mais notez que

default(DateTime) == DateTime.MinValue

jusqu'à la Kind.

Si vous le souhaitez, vous pouvez implémenter une surcharge avec un paramètre de moins (la DateTime) et à partir de cette surcharge, appelez la méthode "main" en transmettant la valeur que vous préférez.

Mais comme l’ont écrit d’autres personnes, le problème est que vous avez écrit de mauvaises prémisses.

Non, DateTime (comme presque tous les ValueTypes. Presque tous parce que Nullable<Nullable<int>> est illégal, même si Nullable<T> est un ValueType) est nullable . Nullable<DateTime> ou DateTime? (même chose)

Même int sont nuls, vous savez? int? :-)

6
xanatos

DateTime.MinValue sera la valeur par défaut.

5
hungryMind

vérifiez le paramètre par défaut dateTime, sa valeur serait 1/1/0001 12:00:00 AM,

private void M(Int32 x = 9, String s = “A”, DateTimedt = default(DateTime), Guidguid = new Guid()) {
Console.WriteLine(“x={0}, s={1}, dt={2}, guid={3}”, x, s, dt, guid);
}
4
Boomer

Si vous utilisez Nullable, les appelants de votre fonction peuvent simplement lui passer un DateTime normal, ils ne remarqueront donc rien.

Si vous voulez définir une valeur par défaut dans votre fonction, vous pouvez faire:

public void Foo(DateTime? value = null)
{
    if ( value == null )
    {
        value = ... // default
    } 
}
3
Wouter de Kort

Extrait de code

public DateTime method1()
{

  if (condition)

    return new DateTime(2007, 5, 30, 11, 32, 00);

  else

    return default(DateTime);

}

L'instruction par défaut initialisera un type de valeur sur sa valeur par défaut. Dans le cas d'une date et heure, cette valeur est également exposée en tant que propriété statique appelée DateTime.MinValue. Si vous utilisez C # 1.0, l'instruction "default (DateTime)" serait équivalente à "DateTime.MinValue". Vous pouvez utiliser cette valeur spéciale comme une sorte de valeur "marqueur", ce qui signifie que si elle est renvoyée, cela indique une date/heure non valide.

Si vous utilisez à nouveau C # 2.0, il est également possible d'utiliser ce qu'on appelle un type nullable et de renvoyer NULL, comme illustré dans l'exemple suivant.

Extrait de code

public DateTime? method2()
{

  if (condition)

    return new DateTime(2007, 5, 30, 11, 32, 00);

  else

    return null;

}
    // This is the best way to null out the DateTime.
    //
    DateTime dateTime2 = DateTime.MinValue;
1
Pranay Rana

Vous pourriez envisager d'utiliser la valeur DateTime.MinValue et utiliser la surcharge. 

1
Kjartan

Cela dépend de votre cas d'utilisation.

Tout ce qui ne correspondra pas à des données réelles fonctionnera, mais cela dépend de votre utilisation (donc d'une certaine manière, -1 pour les entiers, puisqu'il s'agit d'un entier parfaitement correct uniquement pour votre utilisation, étant donné que seuls des entiers positifs ont un sens ).

Si vous envoyez une date minimum (intéressé par tous les trucs postérieurs), alors toute date antérieure à la date raisonnable la plus proche fera l'affaire, et un code comme .Where(f -> f.When > myDate) fonctionnera sans même avoir à rechercher ce cas spécial.

De même, les dates maximales sont inversées (toute date postérieure à la dernière date raisonnable).

Sinon, évitez simplement d'utiliser les valeurs par défaut et surchargez à la place.

0
Jon Hanna