2012-12-19 4 views
132

Y a-t-il une raison de choisir l'une d'entre elles plutôt qu'une autre?new DateTime() vs default (DateTime)

DateTime myDate = new DateTime(); 

ou

DateTime myDate = default(DateTime); 

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

+26

est égal à 'DateTime.MinValue', vous pouvez aussi simplement faire DATETIME myDate = DateTime .MinValue':/ – Lloyd

+13

@Lloyd La plupart du temps ... mais pas en tant que paramètre par défaut DateTime.MinValue n'est pas une constante de temps de compilation - mais par défaut (DateTime)/new DateTime() est. – Ricibob

+7

Juste pour clarifier l'excellent commentaire de Ricibob, parce que c'est important: si vous créez une méthode avec un paramètre optionnel, vous pouvez UNIQUEMENT utiliser 'default (DateTime)' ou 'new DateTime()'. Ce sont deux * constantes de temps de compilation *, requises pour les valeurs de paramètre facultatives. Si les constantes de temps de compilation ne sont pas requises, alors 'default (DateTime)', 'new DateTime()', et 'DateTime.MinValue' sont interchangeables. – leanne

Répondre

139

Non, ils sont identiques.

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

+22

FWIW; En C# 6, ce comportement va changer. C# 6 introduit [constructeur sans paramètre] (https://roslyn.codeplex.com/discussions/562559) pour les structures, ce qui permet au comportement de 'new' de différer de ce que' default (T) 'fera. – vcsjones

+19

On pourrait argumenter que 'default (DateTime)' est plus descriptif de l'intention du programmeur, donc plus favorable en général. –

+8

@vcsjones cela a été supprimé avant la version finale de C# 6.0 cependant. – nawfal

13

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 faire ce qui suit:

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

La myDate.Kind propriété est en lecture seule, ne peut donc pas être modifié après que le constructeur est appelé.

+2

Comment cela répond-il à la question du PO? –

+32

S'il vous plaît voir les 4 premiers mots de ma réponse. –

+2

Je discuterais contre cela. La valeur par défaut 'DateTime' est utile en tant que valeur non définie, avec une simple comparaison avec' default (DateTime) '. A quoi sert une valeur non-par défaut '01/01/0001'? – Rawling

16

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

La ligne suivante ne compilera pas:

private void MyMethod(DateTime syncedTime = DateTime.MinValue) 

Cette ligne compilera:

private void MyMethod(DateTime syncedTime = default(DateTime)) 
+0

C'était la réponse que je cherchais. Merci! – GigaKatowice

+0

Bien sûr, DateTime.MinValue ne compile pas? Les paramètres facultatifs doivent être des constantes de compilation, ce que n'est pas MinValue. default (DateTime) et new DateTime() sont tous les deux bien 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) –