new DateTime () vs default (DateTime)

196

Gibt es einen Grund, einen davon dem anderen vorzuziehen?

DateTime myDate = new DateTime();

oder

DateTime myDate = default(DateTime);

Beide sind gleich 1/1/0001 12:00:00 AM.

RJP
quelle
28
Was gleich ist DateTime.MinValue, also könnten Sie auch genauso gut tun DateTime myDate = DateTime.MinValue: /
Lloyd
20
@Lloyd Meistens ... aber nicht als Standardparameter DateTime.MinValue ist keine Kompilierungszeitkonstante - aber Standard (DateTime) / new DateTime ().
Ricibob
12
Nur um den hervorragenden Kommentar von @ Ricibob zu verdeutlichen, denn es ist wichtig: Wenn Sie eine Methode mit einem optionalen Parameter erstellen, können Sie NUR entweder default(DateTime)oder verwenden new DateTime(). Dies sind beide Kompilierungszeitkonstanten , die für optionale Parameterwerte erforderlich sind. Wenn keine Kompilierungszeitkonstanten erforderlich default(DateTime)sind new DateTime(), DateTime.MinValuesind sie austauschbar.
Leanne

Antworten:

200

Nein, sie sind identisch.

default(), DateTimeruft für jeden Werttyp ( ist ein Werttyp) immer den parameterlosen Konstruktor auf.

Servieren
quelle
29
FWIW; In C # 6 ändert sich dieses Verhalten. C # 6 führt parameterlose Konstruktoren für Strukturen ein, mit denen sich das Verhalten von von newdem unterscheiden kann, was zu default(T)tun ist.
vcsjones
30
Man könnte argumentieren, dass dies default(DateTime)die Absicht des Programmierers besser beschreibt und daher normalerweise günstiger ist.
Intrepidis
16
@vcsjones Dies wurde jedoch vor der endgültigen Veröffentlichung von C # 6.0 entfernt.
Nawfal
5
@nawfal Ja. Wahrscheinlich das Beste, was es auch tat.
vcsjones
Diese Antwort ist einfach falsch, IMO: Die beiden Dinge sind semantisch identisch, aber keiner von beiden ruft einen Konstruktor auf - beide initobj
Syntaxoptionen
22

Wenn Sie den Standardwert für einen DateTime-Parameter in einer Methode verwenden möchten, können Sie nur den Standardwert (DateTime) verwenden.

Die folgende Zeile wird nicht kompiliert:

    private void MyMethod(DateTime syncedTime = DateTime.MinValue)

Diese Zeile wird kompiliert:

    private void MyMethod(DateTime syncedTime = default(DateTime))
Tomer
quelle
3
Natürlich wird DateTime.MinValue nicht kompiliert? Optionale Parameter müssen Konstanten zur Kompilierungszeit sein, MinValue jedoch nicht. default (DateTime) und new DateTime () sind beide gültig (was eigentlich lustig ist, da const DateTime x = default (DateTime) nicht gültig ist, da DateTime-Werte nicht als Konstanten zur Kompilierungszeit deklariert werden können)
Jerri Kangasniemi,
16

Die Antwort ist nein. Denken Sie daran, dass in beiden Fällen , mdDate.Kind = DateTimeKind.Unspecified.

Daher ist es möglicherweise besser, Folgendes zu tun:

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

Die myDate.KindEigenschaft ist schreibgeschützt und kann daher nach dem Aufruf des Konstruktors nicht mehr geändert werden.

Ben C.
quelle
2
Wie beantwortet das die Frage des OP?
Mo Patel
46
Bitte sehen Sie die ersten 4 Wörter meiner Antwort.
Ben C
4
Ich würde dagegen argumentieren. Die Standardeinstellung DateTimeist nützlich als ein nicht festgelegter Wert mit einem einfachen Vergleich zu default(DateTime). Was nützt ein nicht standardmäßiger 01/01/0001Wert?
Rawling
Denken Sie daran, dass es DateTimeKind.Utc anstelle von DateTimeKind.UTC
Roberto
@ Roberto Danke, behoben.
Jpaugh
-3

Der einfachste Weg, dies zu verstehen, ist, dass DateTime eine Struktur ist. Wenn Sie eine Struktur initialisieren, wird sie auf ihren Mindestwert initialisiert:DateTime.Min

Daher gibt es keinen Unterschied zwischen default(DateTime)und new DateTime()undDateTime.Min

G. Busato
quelle
3
Nein, Strukturen werden nicht unbedingt auf ihren Mindestwert initialisiert. Sie werden so initialisiert, dass alle Bits Null sind. Bei einigen Typen ist dies der niedrigste Wert, bei anderen, z. B. bei numerischen Typen, die negativ sein können, ist dies nicht annähernd der Mindestwert. Und natürlich sind andere immer noch nicht vergleichbar und haben keinen "Mindestwert".
Servy