yeni DateTime () ve varsayılan (DateTime)


196

Bunlardan birini diğerinden seçmek için bir neden var mı?

DateTime myDate = new DateTime();

veya

DateTime myDate = default(DateTime);

İkisi de eşit 1/1/0001 12:00:00 AM.


28
Bu da eşit DateTime.MinValue, bu yüzden de yapabilirsiniz DateTime myDate = DateTime.MinValue: /
Lloyd

20
@Lloyd Çoğu zaman ... ancak varsayılan parametre DateTime.MinValue bir derleme zaman sabiti değildir - ancak varsayılan (DateTime) / new DateTime () şeklindedir.
Ricibob

12
Sadece @ Ricibob'un mükemmel yorumunu açıklığa kavuşturmak için önemlidir, çünkü önemlidir: isteğe bağlı bir parametreyle bir yöntem oluşturuyorsanız, SADECE ya default(DateTime)da seçeneğini kullanabilirsiniz new DateTime(). Her ikisi de isteğe bağlı parametre değerleri için gereken derleme zamanı sabitleridir . Derleme zamanı sabitleri gerekli değildir, o zaman default(DateTime), new DateTime()ve DateTime.MinValuebirbirleriyle değiştirilebilir.
leanne

Yanıtlar:


200

Hayır, aynılar.

default(), herhangi bir değer türü için ( DateTimebir değer türüdür) her zaman parametresiz yapıcıyı çağırır.


29
FWIW; C # 6'da bu davranış değişecektir. C # 6 , davranışın ne yapacağından farklı olmasına izin veren yapılar için parametresiz kurucular sunar . newdefault(T)
vcsjones

30
default(DateTime)Programcının niyetinin daha açıklayıcı olduğu, bu nedenle genellikle daha uygun olduğu iddia edilebilir .
intrepidis

16
@vcsjones Ancak bu C # 6.0 son sürümünden önce kaldırıldı.
nawfal

5
@nawfal Evet. Muhtemelen yaptığı en iyisi.
vcsjones

Bu cevap sadece yanlış IMO: iki şey anlamsal olarak aynı, ancak ikisi de bir yapıcı initobj
çağırmıyor

22

Bir yöntemde bir DateTime parametresi için varsayılan değeri kullanmak istiyorsanız, yalnızca varsayılan (DateTime) kullanabilirsiniz.

Aşağıdaki satır derlenmeyecektir:

    private void MyMethod(DateTime syncedTime = DateTime.MinValue)

Bu satır derlenecek:

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

3
Tabii DateTime.MinValue derlemiyor? İsteğe bağlı parametreler, MinValue olmayan derleme zamanı sabitleri olmalıdır. default (DateTime) ve yeni DateTime () her ikisi de geçerlidir. (Bu aslında komiktir, çünkü const DateTime x = default (DateTime) geçerli değildir, çünkü DateTime değerleri derleme zamanı sabitleri olarak bildirilemez)
Jerri Kangasniemi

16

Cevap hayır. Her iki durumda da, unutmayın mdDate.Kind = DateTimeKind.Unspecified.

Bu nedenle aşağıdakileri yapmak daha iyi olabilir:

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

myDate.KindMülkiyet salt okunur, yani kurucu denir sonra değiştirilemez.


2
Bu OP'nin sorusuna nasıl cevap veriyor?
Mo Patel

46
Lütfen cevabımın ilk 4 kelimesine bakın.
Ben C

4
Buna karşı çıkarım. Varsayılan DateTimedeğer, basit bir karşılaştırmayla aa ayarlanmayan bir değer olarak kullanışlıdır default(DateTime). Varsayılan olmayan bir 01/01/0001değer ne işe yarar ?
Rawling

DateTimeKind.UTC yerine DateTimeKind.Utc olduğunu unutmayın
Roberto

@Roberto Teşekkürler, düzeltildi.
jpaugh

-3

Bunu anlamanın en basit yolu DateTime'ın bir yapı olmasıdır. Bir yapıyı başlattığınızda, en küçük değerine sıfırlar:DateTime.Min

Bu nedenle default(DateTime)ve new DateTime()ve arasında hiçbir fark yoktur.DateTime.Min


3
Hayır, yapılar vardır değil mutlaka onların minimum değere başlatıldı. Tüm bitlerin sıfır olduğu için ilklendirilirler. Bazı türler için bu en düşük değeridir, diğerleri için negatif olabilecek sayısal türler gibi, minimum değerlerine yakın bir yer yoktur. Ve elbette, diğerleri hala karşılaştırılamayacak ve "minimum" değere sahip olmayacak .
Servy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.