web-dev-qa-db-fra.com

Définir la valeur par défaut pour DateTime dans un paramètre facultatif

Comment puis-je définir la valeur par défaut de DateTime dans un paramètre facultatif?

public SomeClassInit(Guid docId, DateTime addedOn = DateTime.Now???)
{
    //Init codes here
}
78
Sadegh

Il existe une solution de contournement pour cela, tirant parti des types nullables et du fait que null est une constante au moment de la compilation. (C'est un peu un hack cependant, et je suggère de l'éviter à moins que vous ne puissiez vraiment pas.)

public void SomeClassInit(Guid docId, DateTime? addedOn = null)
{
    if (!addedOn.HasValue)
        addedOn = DateTime.Now;

    //Init codes here
}

En général, je préférerais l'approche de surcharge standard suggérée dans les autres réponses:

public SomeClassInit(Guid docId)
{
    SomeClassInit(docId, DateTime.Now);
}

public SomeClassInit(Guid docId, DateTime addedOn)
{
    //Init codes here
}
121
LukeH

Je suppose que tu ne voulais pas vraiment addedOn = DateTime.Now car cela suggère que vous n'obtiendrez aucun résultat car tout serait ajouté avant "Maintenant". :)

Un DateTime par défaut peut être défini comme ceci:

public void SomeClassInit(Guid docId, DateTime addedOn = default(DateTime))

Mise à jour
Si vous traitez avec SQL Server, n'oubliez pas qu'il n'accepte pas par défaut (DateTime) ce qui est 1/1/0001. Le DateTime minimal de SQL Server est 1/1/1753 ( explication ). Cependant, DateTime2 de SQL accepte le 1/1/0001.

32
Rick Glimmer

Je modifierais légèrement la solution de LukeH comme:

public void SomeClassInit(Guid docId, DateTime? addedOn = null)
{
    DateTime TargetDateTimeProperty = addedOn ?? DateTime.Now;
}

ce qui est plus court et plus lisible, semble-t-il.

24
Alexey Khoroshikh

N'utilisez pas de paramètre facultatif:

public SomeClassInit(Guid docId, DateTime addedOn)
{
    SomeClassInitCore(docId, addedOn);
}

public SomeClassInit(Guid docId)
{
    SomeClassInitCore(docId, null);
}

private SomeClassInitCore(Guid docId, DateTime? addedOn)
{
    // set default value
    if (addedOn.IsNull) addedOn = DateTime.Now;

    //Init codes here
}
5
munificent

. NET 4.0 a des paramètres facultatifs . ( Google est aussi votre ami , ici.)

EDIT (à cause d'Anthony Pegram correct, commentaire) ...

Et oui, c'est comme ça que vous le feriez.

Mais DateTime. Maintenant (propriété statique, sur cette classe) n'est pas connu avant l'exécution . En tant que tel, vous ne pouvez pas l'utiliser comme valeur facultative .

.NET 3.5 ne le fait pas ... alors vous devrez faire ce que JS Bangs a dit ...

public SomeClassInit(Guid docId) 
{ 
    return SomeClassInit(docId, DateTime.Now);
}

public SomeClassInit(Guid docId, DateTime addedOn = DateTime.Now???) 
{ 
    //Init codes here 
}

ou même le paramètre de vérification/valeur nulle de la réponse de munificent.

Vive Anthony.

4
Pure.Krome

C # n'a pas de paramètres facultatifs dans ce sens. Si vous souhaitez rendre addedOn facultatif, vous devez écrire une surcharge qui ne nécessite pas ce paramètre et passer DateTime.Now à la version à deux arguments.

2
JSBձոգչ