new DateTime () vs default (DateTime)

196

Czy istnieje powód, aby wybrać jeden z nich?

DateTime myDate = new DateTime();

lub

DateTime myDate = default(DateTime);

Oba są równe 1/1/0001 12:00:00 AM.

RJP
źródło
28
Co jest równe DateTime.MinValue, więc możesz również zrobić DateTime myDate = DateTime.MinValuerównież: /
Lloyd
20
@Lloyd Przez większość czasu ... ale nie jako domyślny parametr DateTime.MinValue nie jest stałą czasową kompilacji - ale domyślną (DateTime) / new DateTime () jest.
Ricibob
12
Aby wyjaśnić doskonały komentarz @ Ricibob, ponieważ jest to ważne: jeśli tworzysz metodę z opcjonalnym parametrem, możesz WYŁĄCZNIE użyć jednego default(DateTime)lub new DateTime(). Są to obie stałe czasowe kompilacji , wymagane dla opcjonalnych wartości parametrów. Jeśli nie są wymagane kompilacji stałe czasowe, a następnie default(DateTime), new DateTime()i DateTime.MinValuesą wymienne.
leanne

Odpowiedzi:

200

Nie, są identyczne.

default(), dla dowolnego typu wartości ( DateTimejest typem wartości) zawsze wywołuje konstruktora bez parametrów.

Servy
źródło
29
FWIW; W C # 6 to zachowanie się zmieni. C # 6 wprowadza konstruktory bez parametrów dla struktur, które pozwalają na zachowanie newsię odbiegające od tego default(T), co zrobi.
vcsjones
30
Można argumentować, że default(DateTime)jest to bardziej opisowe zamiary programisty, a zatem zazwyczaj bardziej korzystne.
intrepidis,
16
@vcsjones zostało to jednak usunięte przed ostatecznym wydaniem C # 6.0.
nawfal
5
@nawfal Tak. Prawdopodobnie najlepiej też.
vcsjones,
Ta odpowiedź jest po prostu niepoprawna IMO: dwie rzeczy są semantycznie identyczne, ale żadna z nich nie wywołuje konstruktora - wykorzystują obie opcje składniinitobj
Marc Gravell
22

Jeśli chcesz użyć wartości domyślnej parametru DateTime w metodzie, możesz użyć tylko wartości domyślnej (DateTime).

Następujący wiersz nie zostanie skompilowany:

    private void MyMethod(DateTime syncedTime = DateTime.MinValue)

Ta linia skompiluje:

    private void MyMethod(DateTime syncedTime = default(DateTime))
Tomer
źródło
3
Oczywiście DateTime.MinValue się nie kompiluje? Parametry opcjonalne muszą być stałymi czasu kompilacji, których nie ma w MinValue. zarówno default (DateTime), jak i new DateTime () są jednak prawidłowe. (co jest zabawne, ponieważ const DateTime x = default (DateTime) jest niepoprawny, ponieważ wartości DateTime nie można zadeklarować jako stałych czasu kompilacji)
Jerri Kangasniemi
16

Odpowiedź brzmi nie. Pamiętaj, że w obu przypadkachmdDate.Kind = DateTimeKind.Unspecified .

Dlatego może być lepiej wykonać następujące czynności:

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

myDate.KindWłaściwość jest tylko do odczytu, więc nie można zmienić po konstruktor nazywa.

Ben C.
źródło
2
jak to odpowiada na pytanie PO?
Mo Patel
46
Zobacz pierwsze 4 słowa mojej odpowiedzi.
Ben C
4
Sprzeciwiłbym się temu. Wartość domyślna DateTimejest przydatna jako wartość nieokreślona, ​​z prostym porównaniem z default(DateTime). Jakie zastosowanie ma wartość inna niż domyślna 01/01/0001?
Rawling,
Pamiętaj, że to DateTimeKind.Utc zamiast DateTimeKind.UTC
Roberto
@Roberto Dzięki, naprawiono.
jpaugh
-3

Najprostszym sposobem na zrozumienie tego jest to, że DateTime jest strukturą. Kiedy inicjujesz strukturę, inicjuje się do jej minimalnej wartości:DateTime.Min

Dlatego nie ma żadnej różnicy pomiędzy default(DateTime)a new DateTime()iDateTime.Min

G.Busato
źródło
3
Nie, struktury są nie koniecznie inicjowany do wartości minimalnej. Są one inicjowane tak, aby wszystkie bity miały wartość zero. W przypadku niektórych typów jest to ich najniższa wartość, w przypadku innych, takich jak typy liczbowe, które mogą być ujemne, to nie jest blisko ich minimalnej wartości. I oczywiście inne nadal nie będą porównywalne i nie będą miały wartości „minimalnej”.
Servy