nuovo DateTime () vs default (DateTime)


196

C'è un motivo per scegliere uno di questi rispetto all'altro?

DateTime myDate = new DateTime();

o

DateTime myDate = default(DateTime);

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


28
Il che equivale a DateTime.MinValue, quindi potresti anche fare DateTime myDate = DateTime.MinValuealtrettanto: /
Lloyd

20
@Lloyd Il più delle volte ... ma non come parametro predefinito DateTime.MinValue non è una costante di tempo di compilazione, ma default (DateTime) / new DateTime () lo è.
Ricibob,

12
Giusto per chiarire l'eccellente commento di @ Ricibob, perché è importante: se stai creando un metodo con un parametro opzionale, puoi usare SOLO default(DateTime)o new DateTime(). Sono entrambe costanti di tempo di compilazione , necessarie per i valori dei parametri opzionali. Se costanti di tempo di compilazione non sono necessari, quindi default(DateTime), new DateTime()e DateTime.MinValuesono intercambiabili.
leanne,

Risposte:


200

No, sono identici.

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


29
FWIW; In C # 6 questo comportamento cambierà. C # 6 introduce costruttori senza parametri per le strutture, che consentono al comportamento di newdifferire da ciò default(T)che farà.
vcsjones,

30
Si potrebbe sostenere che default(DateTime)sia più descrittivo delle intenzioni del programmatore, quindi generalmente più favorevole.
intrepidis,

16
@vcsjones questo è stato rimosso prima della versione finale di C # 6.0.
nawfal,

5
@nawfal Sì. Probabilmente anche meglio di così.
vcsjones,

Questa risposta è semplicemente sbagliata IMO: le due cose sono semanticamente identiche, ma nessuna delle due chiama un costruttore - usano entrambe le opzioni di sintassiinitobj
Marc Gravell

22

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

La seguente riga non verrà compilata:

    private void MyMethod(DateTime syncedTime = DateTime.MinValue)

Questa riga compilerà:

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

3
Ovviamente DateTime.MinValue non viene compilato? I parametri opzionali devono essere costanti di compilazione, mentre MinValue non lo è. default (DateTime) e il nuovo DateTime () sono entrambi validi (il che è in realtà divertente, perché const DateTime x = default (DateTime) non è valido, poiché i valori di DateTime non possono essere dichiarati come costanti di compilazione)
Jerri Kangasniemi,

16

La risposta è no. Tenete a mente che in entrambi i casi, mdDate.Kind = DateTimeKind.Unspecified.

Pertanto potrebbe essere meglio effettuare le seguenti operazioni:

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

La myDate.Kindproprietà è di sola lettura, quindi non può essere modificata dopo la chiamata al costruttore.


2
come risponde alla domanda del PO?
Mo Patel,

46
Si prega di vedere le prime 4 parole della mia risposta.
Ben C

4
Discuterei contro questo. L'impostazione predefinita DateTimeè utile come valore non impostato, con un semplice confronto a default(DateTime). A che serve un 01/01/0001valore non predefinito ?
Rawling

Ricorda che è DateTimeKind.Utc invece di DateTimeKind.UTC
Roberto

@Roberto Grazie, risolto.
jpaugh

-3

Il modo più semplice per capirlo è che DateTime è una struttura. Quando si inizializza una struttura, questa viene inizializzata al valore minimo:DateTime.Min

Pertanto non vi è alcuna differenza tra default(DateTime)e new DateTime()eDateTime.Min


3
No, le strutture non sono necessariamente inizializzate al loro valore minimo. Vengono inizializzati su zero tutti i bit. Per alcuni tipi, questo è il loro valore più basso, per altri, come i tipi numerici che possono essere negativi, non è vicino al loro valore minimo. E, naturalmente, altri non saranno ancora comparabili e non avranno un valore "minimo".
Serve il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.