2010-06-13 8 views
61

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

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

Ce n'est pas un doublon Les Timespans fonctionnent différemment dans C# que dans les timespans.C'est faisable dans C# avec 'DateTimeConstantAttribute' mais les timespans ne supportent pas cela. – leat

Répondre

97

Il existe une solution de contournement pour cela, en tirant parti des types Nullable et du fait que null est une constante de compilation. (Il est un peu bidouillage, et je vous suggère d'é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ère l'approche suggérée dans la surcharge norme les autres réponses:

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

public SomeClassInit(Guid docId, DateTime addedOn) 
{ 
    //Init codes here 
} 
+1

Je ne comprends pas vraiment pourquoi les paramètres optionnels doivent être des constantes de compilation. Le compilateur pourrait facilement créer les 2 méthodes que vous avez écrites à partir de celle avec les paramètres optionnels ... Je préfère généralement avoir une méthode avec plusieurs paramètres optionnels au lieu de plusieurs méthodes, cela rend le code plus petit et donc plus facile à lire. – user276648

+6

Vous pouvez utiliser coalesce ici: 'addedOn = addedOn ?? DateTime.Now' –

+0

Nullables peut causer des problèmes de casting en profondeur dans votre code, donc je ne suis pas un fan. Je suis de plus en plus déçu en C#. Je veux dire, même VB.net a des dates littérales, telles que: Facultatif ajoutéOn As DateTime = # 12: 00: 00 PM # – Brain2000

2

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 transmettre DateTime.Now à la version à deux arguments.

+1

er .. bien sûr que JS Bangs? pour la version de framework .NET 3.5 et ci-dessous, vous avez raison. sinon, 4.0 et plus, il est pris en charge. –

+1

@ Pure.Krome, les valeurs par défaut des paramètres facultatifs doivent être des constantes de temps de compilation. Donc, ce n'est * pas * pris en charge. (Cette réponse pourrait être mieux formulée, cependant.) –

+1

J'ai trop mal compris le libellé. soz JS. –

4

Ne pas utiliser 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

.NET 4.0 does have optional parameters. (google is also your friend, ici.)

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

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

Mais DateTime.Maintenant (propriété statique, sur cette classe) ne sait pas jusqu'à exécution. En tant que tel, vous ne pouvez pas utiliser cela comme une valeur en option.

.NET 3.5 ne pas ... donc alors vous devez 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 contrôle null/null valeur de la réponse de munificence.

À votre santé Anthony.

+0

La valeur par défaut doit être une constante de temps de compilation, donc cela ne fonctionnera pas même dans 4.0. –

+0

Anothonie confirmée. Je vais rééditer mon post. À votre santé. –

21

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

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

qui est plus court et plus facile à lire, il semble.

19

Je suppose que vous ne vouliez pas vraiment addedOn = DateTime.Now parce que cela suggérerait que vous n'obtiendrez jamais aucun résultat car tout serait ajouté avant 'maintenant'. :)

A défaut DateTime peut être défini comme ceci:

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

Mise à jour
Si vous traitez avec SQL Server, ne pas oublier 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 (explanation). SQL DateTime2 accepte 1/1/0001, cependant.

+0

Ne comprends pas pourquoi ce n'est pas marqué comme la réponse, il permet de travailler beaucoup plus facile avec datetime, depuis datetime? ! = datetime – user3800527

+0

Ceci est la bonne réponse. –

+0

Je vais juste exprimer ce que les autres ont dit, c'est la bonne réponse. Les autres ne font que tromper le système. – CyberClaw

Questions connexes