new DateTime () vs default (DateTime)

196

Y a-t-il une raison de choisir l'un de ceux-ci plutôt que l'autre?

DateTime myDate = new DateTime();

ou

DateTime myDate = default(DateTime);

Les deux sont égaux 1/1/0001 12:00:00 AM.

RJP
la source
28
Ce qui est égal à DateTime.MinValue, donc vous pouvez aussi faire DateTime myDate = DateTime.MinValueaussi bien: /
Lloyd
20
@Lloyd La plupart du temps ... mais pas comme paramètre par défaut DateTime.MinValue n'est pas une constante de temps de compilation - mais par défaut (DateTime) / new DateTime () l'est.
Ricibob
12
Juste pour clarifier l'excellent commentaire de @ Ricibob, car c'est important: si vous créez une méthode avec un paramètre optionnel, vous pouvez UNIQUEMENT utiliser soit default(DateTime)ou new DateTime(). Ce sont tous les deux des constantes de temps de compilation , requises pour les valeurs de paramètre facultatives. Si les constantes de temps de compilation ne sont pas nécessaires, alors default(DateTime), new DateTime()et DateTime.MinValuesont interchangeables.
leanne

Réponses:

200

Non, ils sont identiques.

default(), pour tout type de valeur ( DateTimeest un type de valeur) appellera toujours le constructeur sans paramètre.

Servy
la source
29
FWIW; En C # 6, ce comportement changera. C # 6 introduit des constructeurs sans paramètre pour les structures, qui permettent au comportement de newdifférer de ce qui default(T)va faire.
vcsjones
30
On pourrait dire que default(DateTime)c'est plus descriptif de l'intention du programmeur, donc généralement plus favorable.
intrepidis
16
@vcsjones cela a été supprimé avant la version finale de C # 6.0 cependant.
nawfal
5
@nawfal Ouais. Probablement mieux que ça aussi.
vcsjones
Cette réponse est tout simplement fausse IMO: les deux choses sont sémantiquement identiques, mais aucune d'elles n'appelle un constructeur - les deux options de syntaxe utilisentinitobj
Marc Gravell
22

Si vous souhaitez utiliser la valeur par défaut pour un paramètre DateTime dans une méthode, vous ne pouvez utiliser que default (DateTime).

La ligne suivante ne compilera pas:

    private void MyMethod(DateTime syncedTime = DateTime.MinValue)

Cette ligne compilera:

    private void MyMethod(DateTime syncedTime = default(DateTime))
Tomer
la source
3
Bien sûr, DateTime.MinValue ne compile pas? Les paramètres facultatifs doivent être des constantes de compilation, ce que MinValue n'est pas. default (DateTime) et new DateTime () sont tous les deux valides (ce qui est en fait amusant, car const DateTime x = default (DateTime) n'est pas valide, car les valeurs DateTime ne peuvent pas être déclarées comme constantes de compilation)
Jerri Kangasniemi
16

La réponse est non. Gardez à l' esprit que dans les deux cas, mdDate.Kind = DateTimeKind.Unspecified.

Par conséquent, il peut être préférable de procéder comme suit:

DateTime myDate = new DateTime(1, 1, 1, 0, 0, 0, DateTimeKind.Utc);

La myDate.Kindpropriété est en lecture seule, elle ne peut donc pas être modifiée après l'appel du constructeur.

Ben C
la source
2
comment cela répond-il à la question du PO?
Mo Patel
46
Veuillez voir les 4 premiers mots de ma réponse.
Ben C
4
Je argumenterais contre cela. La valeur par défaut DateTimeest utile en tant que valeur non définie, avec une simple comparaison avec default(DateTime). À quoi sert une 01/01/0001valeur autre que celle par défaut ?
Rawling
Gardez à l'esprit que c'est DateTimeKind.Utc au lieu de DateTimeKind.UTC
Roberto
@Roberto Merci, corrigé.
jpaugh
-3

La façon la plus simple de le comprendre est que DateTime est une structure. Lorsque vous initialisez une structure, elle est initialisée à sa valeur minimale:DateTime.Min

Il n'y a donc pas de différence entre default(DateTime)et new DateTime()etDateTime.Min

G.Busato
la source
3
Non, les structures ne sont pas nécessairement initialisées à leur valeur minimale. Ils sont initialisés à tous les bits étant à zéro. Pour certains types, c'est leur valeur la plus basse, pour d'autres, comme les types numériques qui peuvent être négatifs, ce n'est pas près de leur valeur minimale. Et bien sûr, d' autres encore ne seront pas comparables et ne seront pas avoir une valeur « minimale ».
Servy