Quelle devrait être la valeur par défaut dans un paramètre optionnel 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 veut spécifier Aucune valeur pour celui-ci.

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

Si ce 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? Il n'est pas nullable, et (pour autant que je sache) il n'a pas un nombre sans signification qui ne peut pas non plus être une vraie entrée (comme -1 pour un entier positif). Ou est-il? Que feriez-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 également utiliser Nullable plutôt que de simplement passer commodément un DateTime.

24
demandé sur Louis Rhys 2011-10-20 14:17:55

10 réponses

Vous pouvez rendre les types de valeur nullable en utilisant l'opérateur ? en C#:

DateTime? myDate = null;

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

void Foo(DateTime? myDate = null)
{
}

Pour en savoir plus sur les Types Nullable.

Ce n'est pas la seule façon de peler le chat cependant, vous pouvez utiliser default(DateTime), mais vous ne pouvez pas utiliser DateTime.MinValue, MaxValue, ou Now dans les paramètres optionnels car ils ne sont pas des constantes de compilation.

Bien sûr, vous n'avez pas besoin d'utiliser des paramètres optionnels, 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 aller overkill (enfin, peut - être pas overkill, beaucoup de raisons valables pour le faire), alors 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 faire en sorte que n'importe quelle date représente une valeur par défaut si vous le souhaitez, mais pour des choses comme les paramètres facultatifs, vous aurez des limites.

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

32
répondu Adam Houldsworth 2011-10-20 10:37:54

Default (DateTime) - l'opérateur par défaut lui est destiné

15
répondu Vasya 2011-10-20 10:21:04

A la question "qu'est-ce qui 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 ne sont que static readonly, mais notez que

default(DateTime) == DateTime.MinValue

Jusqu'au Kind.

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

Mais comme écrit par d'autres, le problème est que vous avez mal écrit prémisse.

N, DateTime (comme presque tous les ValueTypes. Presque toutes car 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 nullables, vous savez? int? :-)

6
répondu xanatos 2011-10-20 10:32:45

DateTime.MinValue sera la valeur par défaut.

5
répondu hungryMind 2011-10-20 10:28:15

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
répondu Boomer 2011-10-20 10:22:35

Si vous utilisez le Nullable, les appelants de votre fonction peuvent simplement lui passer un DateTime régulier, donc ils ne remarqueront rien:) il y a des opérateurs implicites qui le feront pour vous

Si vous souhaitez 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
répondu Wouter de Kort 2012-01-08 19:40:18

Extrait De Code

public DateTime method1()
{

  if (condition)

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

  else

    return default(DateTime);

}

L'instruction default initialise un type de valeur à sa valeur par défaut. Dans le cas d'un datetime, 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, elle indique une date-heure invalide.

Si vous utilisez à nouveau C # 2.0, Il est également possible d'utiliser ce qui est appelé un type nullable, et renvoie effectivement NULL, comme indiqué dans l'exemple suivant

Extrait De Code

public DateTime? method2()
{

  if (condition)

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

  else

    return null;

}
2
répondu Sai Kalyan Kumar Akshinthala 2011-10-20 10:25:46
    // This is the best way to null out the DateTime.
    //
    DateTime dateTime2 = DateTime.MinValue;
1
répondu Pranay Rana 2011-10-20 10:20:54

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

1
répondu Kjartan 2011-10-20 10:22:38

Dépend de votre cas d'utilisation.

Tout ce qui ne correspondra pas aux données réelles fonctionnera, mais cela dépend de votre utilisation de celui-ci (donc d'une certaine manière -1 pour les entiers, puisque c'est un entier parfaitement bon seulement pour votre utilisation de celui-ci).

Si vous envoyez une date minimale (intéressée par tous les foo qui sont plus tard), toute date antérieure à la date raisonnable la plus ancienne fera l'affaire, et le code comme .Where(f -> f.When > myDate) fonctionnera sans même avoir à chercher ce spécial cas.

De même avec les dates maximales en sens inverse (toute date qui serait après la dernière date raisonnable).

Sinon, évitez simplement l'utilisation des valeurs par défaut, et surchargez à la place.

0
répondu Jon Hanna 2011-10-20 11:39:31