DateTime () baru vs default (DateTime)

196

Apakah ada alasan untuk memilih salah satu dari ini?

DateTime myDate = new DateTime();

atau

DateTime myDate = default(DateTime);

Keduanya sama 1/1/0001 12:00:00 AM.

RJP
sumber
28
Yang sama dengan DateTime.MinValue, sehingga Anda juga bisa melakukannya DateTime myDate = DateTime.MinValuejuga: /
Lloyd
20
@Lloyd Sebagian besar waktu ... tetapi bukan sebagai parameter default DateTime.MinValue bukan konstanta waktu kompilasi - tetapi default (DateTime) / DateTime baru () adalah.
Ricibob
12
Hanya untuk memperjelas komentar Ricibob yang luar biasa, karena itu penting: jika Anda membuat metode dengan parameter opsional, Anda HANYA dapat menggunakan salah satu default(DateTime)atau new DateTime(). Keduanya adalah konstanta waktu kompilasi , diperlukan untuk nilai parameter opsional. Jika konstanta waktu kompilasi tidak diperlukan, maka default(DateTime), new DateTime(), dan DateTime.MinValueyang dipertukarkan.
leanne

Jawaban:

200

Tidak, mereka identik.

default(), untuk semua tipe nilai ( DateTimeadalah tipe nilai) akan selalu memanggil konstruktor tanpa parameter.

Melayani
sumber
29
FWIW; Di C # 6 perilaku ini akan berubah. C # 6 memperkenalkan konstruktor tanpa parameter untuk struct, yang memungkinkan perilaku newberbeda dari apa yang default(T)akan dilakukan.
vcsjones
30
Orang bisa berpendapat bahwa default(DateTime)ini lebih deskriptif dari maksud programmer, oleh karena itu biasanya lebih menguntungkan.
intrepidis
16
@vcsjones ini telah dihapus sebelum rilis final C # 6.0.
nawfal
5
@nawfal Ya. Mungkin yang terbaik juga.
vcsjones
Jawaban ini hanya salah IMO: kedua hal itu identik secara semantik, tetapi tidak satu pun dari mereka memanggil konstruktor - keduanya menggunakan opsi sintaksinitobj
Marc Gravell
22

Jika Anda ingin menggunakan nilai default untuk parameter DateTime dalam suatu metode, Anda hanya bisa menggunakan default (DateTime).

Baris berikut tidak akan dikompilasi:

    private void MyMethod(DateTime syncedTime = DateTime.MinValue)

Baris ini akan mengkompilasi:

    private void MyMethod(DateTime syncedTime = default(DateTime))
Tomer
sumber
3
Tentu saja DateTime.MinValue tidak dikompilasi? Parameter opsional harus berupa konstanta waktu kompilasi, yang bukan MinValue. default (DateTime) dan DateTime baru () keduanya valid. (yang sebenarnya lucu, karena const DateTime x = default (DateTime) tidak valid, karena nilai DateTime tidak dapat dideklarasikan sebagai konstanta waktu kompilasi)
Jerri Kangasniemi
16

Jawabannya adalah tidak. Ingatlah bahwa dalam kedua kasus mdDate.Kind = DateTimeKind.Unspecified,.

Karena itu mungkin lebih baik untuk melakukan hal berikut:

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

The myDate.Kindproperti dibaca, sehingga tidak dapat diubah setelah konstruktor disebut.

Ben C
sumber
2
bagaimana itu menjawab pertanyaan OP?
Mo Patel
46
Silakan lihat 4 kata pertama dari jawaban saya.
Ben C
4
Saya menentang hal ini. Default DateTimeini berguna sebagai nilai value-not-set, dengan perbandingan sederhana untuk default(DateTime). Apa gunanya nilai non-standar 01/01/0001?
Rawling
Ingatlah bahwa itu adalah DateTimeKind.Utc dan bukan DateTimeKind.UTC
Roberto
@Roberto Terima kasih, sudah diperbaiki.
jpaugh
-3

Cara paling sederhana untuk memahaminya adalah DateTime adalah sebuah struct. Ketika Anda menginisialisasi sebuah struct, itu akan menginisialisasi nilai minimum:DateTime.Min

Oleh karena itu tidak ada perbedaan antara default(DateTime)dan new DateTime()danDateTime.Min

G.Busato
sumber
3
Tidak, struct tidak harus diinisialisasi ke nilai minimumnya. Mereka diinisialisasi ke semua bit menjadi nol. Untuk beberapa jenis, itulah nilai terendahnya, untuk yang lain, seperti jenis numerik yang bisa negatif, tidak ada yang mendekati nilai minimumnya. Dan tentu saja, yang lain masih tidak akan sebanding dan tidak akan memiliki nilai "minimum".
Servy