Définir la valeur par défaut pour DateTime dans le paramètre optionnel [dupliquer]

cette question a déjà une réponse ici:

comment définir la valeur par défaut de DateTime dans le paramètre optionnel?

public SomeClassInit(Guid docId, DateTime addedOn = DateTime.Now???)
{
    //Init codes here
}
70
demandé sur PiotrWolkowski 2010-06-13 08:47:31

6 réponses

il y a une solution pour contourner cela, en profitant des types nullables et du fait que null est une constante de temps de compilation. (C'est un peu un piratage cependant, et je suggère de l'éviter à moins que vous ne pouvez 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
}
108
répondu LukeH 2010-06-13 06:28:31

je suppose que vous ne vouliez pas vraiment addedOn = DateTime.Now parce que cela suggérerait que vous n'obtiendriez jamais de résultat puisque tout serait ajouté avant "maintenant". :)

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

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

mise à jour

Si vous vous occupez de SQL Server, n'oubliez pas qu'il n'accepte pas par défaut(DateTime) ce qui est 1/1/0001. La DateTime minimale de SQL Server is 1/1/1753 ( explication ). La DateTime2 de SQL accepte le 1/1/0001, cependant.

24
répondu user1467978 2017-05-23 12:34:41

j'ai légèrement modifié la solution de LukeH comme:

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

qui est plus court et plus lisible, il me semble.

22
répondu Alexey Khoroshikh 2011-07-25 08:15:50

N'utilisez pas un 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
}
4
répondu munificent 2010-06-13 04:52:11

.NET 4.0 a des paramètres optionnels . ( google est également votre ami , ici.)

EDIT (à cause de Anthony Pegram correct, commentaire)...

et oui, c'est comme ça que tu le ferais.

Mais DateTime. Maintenant (propriété statique, sur cette classe) est de ne pas savoir jusqu'à ce que run-time . En tant que tel, vous ne pouvez pas utilisez cette option comme valeur .

... donc tu devrais 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 null checking/null value de la réponse de munificent.

Santé Anthony.

4
répondu Pure.Krome 2010-06-13 05:07:40

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

2
répondu JSBձոգչ 2010-06-13 04:50:41