2012-12-19 16 views
132

Czy jest jakiś powód, aby wybrać jedną z nich drugą?new DateTime() vs domyślnie (DateTime)

DateTime myDate = new DateTime(); 

lub

DateTime myDate = default(DateTime); 

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

+26

która jest równa 'DateTime.MinValue', więc można też po prostu zrobić' DateTime MyDate = DateTime .MinValue' również:/ – Lloyd

+13

@Lloyd Przez większość czasu ... ale nie jako domyślny parametr DateTime.MinValue nie jest stałą czasu kompilacji - ale domyślną (DateTime)/new DateTime() jest. – Ricibob

+7

Tylko dla wyjaśnienia doskonałego komentarza @ Ricibob, ponieważ jest to ważne: jeśli tworzysz metodę z opcjonalnym parametrem, możesz użyć TYLKO 'default (DateTime)' lub 'new DateTime()'. Są to * * stałe kompilacji *, wymagane dla opcjonalnych wartości parametrów. Jeśli stałe czasowe kompilacji nie są wymagane, wówczas 'default (DateTime)', 'new DateTime()' oraz 'DateTime.MinValue' są wymienne. – leanne

Odpowiedz

139

Nie, są identyczne.

default(), dla każdego rodzaju wartości (DateTime jest typem wartości) będzie zawsze wywoływał konstruktor bez parametrów.

+22

FWIW; W języku C# 6 to zachowanie się zmieni. C# 6 wprowadza [konstruktory bez parametrów] (https://roslyn.codeplex.com/discussions/562559) dla struktur, które pozwalają na zachowanie 'nowego' różnić się od tego, co zrobi' default (T) '. – vcsjones

+19

Można argumentować, że 'default (DateTime)' jest bardziej opisowy dla intencji programisty, dlatego zazwyczaj jest bardziej korzystny. –

+8

@vcsjones to zostało usunięte przed ostatecznym wydaniem C# 6.0 jednak. – nawfal

13

Odpowiedź brzmi: nie. Należy pamiętać, że w obu przypadkach, mdDate.Kind = DateTimeKind.Unspecified.

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

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

Obiekt myDate.Kind jest tylko do odczytu, więc nie można zmienić po konstruktor nazywa.

+2

jak to odpowiada na pytanie OP? –

+32

Proszę zobaczyć pierwsze 4 słowa z mojej odpowiedzi. –

+2

Sprzeciwiłbym się temu. Domyślna wartość "DateTime" jest przydatna jako wartość nie-ustawiona, z prostym porównaniem do 'default (DateTime)'. Jaki jest pożytek z innej niż domyślna wartości "01/01/0001"? – Rawling

16

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

Poniższy wiersz nie zostanie skompilowany:

private void MyMethod(DateTime syncedTime = DateTime.MinValue) 

Linia ta zostanie skompilowany:

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

To była odpowiedź, której szukałem. Dzięki! – GigaKatowice

+0

Oczywiście DateTime.MinValue nie kompiluje? Opcjonalne parametry muszą być stałymi w czasie kompilacji, których MinValue nie jest. domyślne (DateTime) i new DateTime() są prawidłowe. (co jest zabawne, ponieważ const DateTime x = default (DateTime) jest nieprawidłowe, ponieważ wartości DateTime nie mogą być zadeklarowane jako stałe w czasie kompilacji) –

Powiązane problemy