2012-12-19 20 views
132

C'è un motivo per scegliere uno di questi rispetto all'altro?new DateTime() vs default (DateTime)

DateTime myDate = new DateTime(); 

o

DateTime myDate = default(DateTime); 

Entrambi sono uguali 1/1/0001 12:00:00 AM.

+26

che è uguale a 'DateTime.MinValue', così si potrebbe anche solo fare' DateTime myDate = DateTime .MinValue':/ – Lloyd

+13

@Lloyd La maggior parte delle volte ... ma non come parametro predefinito DateTime.MinValue non è una costante di tempo di compilazione, ma è predefinito (DateTime)/new DateTime(). – Ricibob

+7

Giusto per chiarire l'eccellente commento di @ Ricibob, perché è importante: se stai creando un metodo con un parametro opzionale, puoi SOLO usare "default (DateTime)" o "new DateTime()". Quelle sono entrambe * costanti di tempo di compilazione *, richieste per i valori dei parametri facoltativi. Se non sono richieste costanti di tempo di compilazione, allora 'default (DateTime)', 'new DateTime()' e 'DateTime.MinValue' sono intercambiabili. – leanne

risposta

139

No, sono identici.

default(), per qualsiasi tipo di valore (DateTime è un tipo di valore) chiamerà sempre il costruttore senza parametri.

+22

FWIW; In C# 6 questo comportamento cambierà. Il C# 6 introduce [costruttori senza parametri] (https://roslyn.codeplex.com/discussions/562559) per le struct, che permettono al comportamento di 'new' di differire da ciò che' default (T) 'farà. – vcsjones

+19

Si potrebbe obiettare che 'default (DateTime)' è più descrittivo dell'intento del programmatore, quindi di solito è più favorevole. –

+8

@vcsjones questo è stato rimosso prima del rilascio finale di C# 6.0. – nawfal

13

La risposta è no. Tieni presente che in entrambi i casi, mdDate.Kind = DateTimeKind.Unspecified.

Pertanto, può essere meglio per effettuare le seguenti operazioni:

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

La proprietà myDate.Kind è di sola lettura, in modo che non può essere modificato dopo che il costruttore viene chiamato.

+2

come risponde la domanda dell'OP? –

+32

Si prega di vedere le prime 4 parole della mia risposta. –

+2

Discuterei di questo. Il 'DateTime' predefinito è utile come valore non impostato, con un semplice confronto con' default (DateTime) '. A che cosa serve un valore '01/01/0001' non predefinito? – Rawling

16

Se si desidera utilizzare il valore predefinito per un parametro DateTime in un metodo, è possibile utilizzare solo l'impostazione predefinita (DateTime).

La seguente riga non verrà compilato:

private void MyMethod(DateTime syncedTime = DateTime.MinValue) 

questa linea sarà la compilazione:

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

Questa era la risposta che stavo cercando. Grazie! – GigaKatowice

+0

Ovviamente DateTime.MinValue non viene compilato? I parametri facoltativi devono essere costanti in fase di compilazione, che MinValue non è. default (DateTime) e new DateTime() sono entrambi validi però. (che in realtà è divertente, perché const DateTime x = default (DateTime) non è valido, poiché i valori DateTime non possono essere dichiarati come costanti in fase di compilazione) –