80 votes

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

Comment puis-je définir la valeur par défaut pour DateTime en paramètre facultatif?

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

125voto

LukeH Points 110965

Il existe une solution de contournement pour cela, tirant parti des types nullables et du fait que null est une constante de la compilation. (C'est un peu un bidouillage cependant, et je suggérerais 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
}
 

34voto

user1467978 Points 31

Je suppose que vous n'avez pas vraiment envie addedOn = DateTime.Now parce que vous suggère de ne jamais obtenir un résultat que tout devrait être ajouté avant le "Maintenant". :)

Par défaut DateTime peut être définie comme ceci:

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

Mise à jour
Si vous faites affaire avec SQL Serveur, n'oubliez pas qu'il n'accepte pas par défaut(DateTime) qu'est-ce que 1/1/0001. SQL Server est minime DateTime est 1/1/1753 (explication). SQL DateTime2 accepte 1/1/0001, cependant.

24voto

Je modifierais légèrement la solution de LukeH en tant que:

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

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

5voto

munificent Points 6516

N'utilisez pas de paramètre optionnel:

 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
}
 

4voto

Pure.Krome Points 28473

.NET 4.0 n'ont paramètres facultatifs. (google est aussi ton ami, ici.)

EDIT (parce que d'Anthony Pegram correct, commentaire)...

Et oui, c'est la façon dont vous le feriez.

Mais DateTime.Maintenant (propriété statique, sur cette classe) n'est pas de savoir jusqu' au moment de l'exécution. En tant que tel, vous ne pouvez pas l'utiliser comme une option de valeur.

.NET 3.5 n'est pas ... donc, alors que vous auriez à faire ce que JS Bangs 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 nul de la vérification/null valeur de paramètre de généreux réponse.

Cheers Anthony.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X