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.