2010-11-28 16 views

Antwort

13

Dieses eine neue Instanz des A Art erzeugt, indem die Standard Aufruf, parameterlosen Konstruktor:

A a = new A(); 

Dieser für Typ den Standardwert zuweist A auf die Variable a und rufen keinen Konstruktor an all:

A a = default(A); 

der Hauptunterschied ist, dass der Standardwert eines Typs null für referen ist ce-Typen und ein Null-Bit-Wert für alle Werttypen (also default(int) wäre 0, default(bool) wäre false, etc.).

+6

@Fermaref - Nicht sicher, wo Sie das haben. Die Anweisung 'var x = default (TestClass); 'weist' x' –

+0

zu, okay, ich habe meinen Fehler bemerkt. Ich habe ihm einen Typ-Wert-Parameter geliefert, als ich versuchte, es zu verwenden, nicht den Typ-Namen, und das funktioniert nur in Generika. Es tut mir Leid. – Femaref

0

Das neue Schlüsselwort signalisiert immer die Speicherzuweisung für Referenztypen. Kein anderes Konstrukt erstellt tatsächlich Speicherplatz für die Daten, die Sie erstellen möchten. Bei Werttypen wird deren Speicher immer vorbelegt, wenn sie in einer Funktion oder Prozedur verwendet werden. Mit dem Schlüsselwort default kann ein generischer Typ seinen Standardwert (nicht initialisiert) oder null für Referenztypen zurückgeben.

+0

Der Standardwert von Werttypen ist NICHT nicht initialisiert. Es wird auf Null initialisiert. – CodesInChaos

+0

Sie sind richtig, aber was ich mit nicht initialisiert meinte, wird nicht vom Benutzer initialisiert (wie 'int i = 100;'), sondern vom Compiler. Entschuldigung für die Verwirrung. – ja72

2

Für Werttypen gibt es keinen Unterschied, da der Standardkonstruktor eines Werttyps immer dem Standardwert (T) entspricht. Es füllt einfach alles mit 0, null, 0.0 ... In der Standardimplementierung von .net entspricht das nur dem Füllen alles in Ihrer Variablen mit binär Null.

Für Referenztypen ruft new T() den Standardkonstruktor auf und gibt einen (normalerweise) Nicht-Null-Verweis zurück.
default(T) auf der anderen Seite entspricht in diesem Fall null.

default(T) ist wichtig, weil es einen gültigen Wert von T darstellt, unabhängig davon, ob T ein Referenz- oder Werttyp ist. Dies ist sehr nützlich bei der generischen Programmierung.
Zum Beispiel in Funktionen wie FirstOrDefault benötigen Sie einen gültigen Wert für Ihr Ergebnis in dem Fall, in dem der Enumerable keine Einträge hat. Und Sie verwenden nur default(T) dafür, da es das einzige Ding ist, das für jeden Typ gültig ist.

Das Aufrufen des Standardkonstruktors für Referenztypen erfordert eine generische Einschränkung. Und nicht jeder Referenztyp implementiert einen Standardkonstruktor. Du kannst es also nicht immer benutzen.

Verwandte Themen