Das defaultSchlüsselwort ist kontextbezogen, da es mehrere Verwendungen hat. Ich vermute, dass Sie sich auf die neuere C # 2-Bedeutung beziehen, in der der Standardwert eines Typs zurückgegeben wird. Für Referenztypen ist dies nullund für Werttypen ist dies eine neue Instanz, die alle auf Null gesetzt ist.
Hier einige Beispiele, um zu demonstrieren, was ich meine:
using System;
classExample
{
staticvoidMain()
{
Console.WriteLine(default(Int32)); // Prints "0"
Console.WriteLine(default(Boolean)); // Prints "False"
Console.WriteLine(default(String)); // Prints nothing (because it is null)
}
}
Die häufigste Verwendung ist bei Generika ; Während es für "normale" Typen (dh usw.) funktioniertdefault(string) , ist dies in handgeschriebenem Code ziemlich ungewöhnlich.
Ich verwende diesen Ansatz jedoch bei der Codegenerierung, da dies bedeutet, dass ich nicht alle verschiedenen Standardeinstellungen fest codieren muss - ich kann nur den Typ und die Verwendung default(TypeName)im generierten Code herausfinden .
Bei Generika ist die klassische Verwendung das TryGetValueMuster:
publicstaticboolTryGetValue(string key, out T value) {
if(canFindIt) {
value = ...;
returntrue;
}
value = default(T);
returnfalse;
}
Hier wir haben einen Wert zuweisen , das Verfahren zu beenden, aber der Anrufer soll nicht wirklich, was es ist. Sie können dies der Konstruktoreinschränkung gegenüberstellen:
publicstatic T CreateAndInit<T>() where T : ISomeInterface, new() {
T t = new T();
t.SomeMethodOnInterface();
return t;
}
+1 bei T: new () vs. default (T). Ich bevorzuge wo T: new (), da es den vollständigen Konstruktor der generischen Klasse aufruft. Die Standardeinstellung (T) ist jedoch äußerst nützlich, wenn die Einschränkung new () nicht erfüllt werden kann. Dh unveränderlich / Singleton verbietet new ().
Robert J. Good
13
Das Standardschlüsselwort hat je nach Verwendungskontext unterschiedliche Semantiken.
Das Schlüsselwort "default" (abgesehen von "switch-case") hilft Ihnen beim Initialisieren der Instanz eines Objekts wie Klasse, Liste und weiterer Typen. Es wird aufgrund seiner generischen Eigenschaft verwendet, mit der Sie den Standardwert des Typs zuweisen können, wenn Sie ihn nicht kennen Wert als Fortschritt, um Fehler in Ihrem weiteren (zukünftigen) Code zu vermeiden.
Antworten:
Das
default
Schlüsselwort ist kontextbezogen, da es mehrere Verwendungen hat. Ich vermute, dass Sie sich auf die neuere C # 2-Bedeutung beziehen, in der der Standardwert eines Typs zurückgegeben wird. Für Referenztypen ist diesnull
und für Werttypen ist dies eine neue Instanz, die alle auf Null gesetzt ist.Hier einige Beispiele, um zu demonstrieren, was ich meine:
using System; class Example { static void Main() { Console.WriteLine(default(Int32)); // Prints "0" Console.WriteLine(default(Boolean)); // Prints "False" Console.WriteLine(default(String)); // Prints nothing (because it is null) } }
quelle
Sie können default verwenden, um auch den Standardwert von a zu erhalten
Generic Type
.public T Foo<T>() { . . . return default(T); }
quelle
Die häufigste Verwendung ist bei Generika ; Während es für "normale" Typen (dh usw.) funktioniert
default(string)
, ist dies in handgeschriebenem Code ziemlich ungewöhnlich.Ich verwende diesen Ansatz jedoch bei der Codegenerierung, da dies bedeutet, dass ich nicht alle verschiedenen Standardeinstellungen fest codieren muss - ich kann nur den Typ und die Verwendung
default(TypeName)
im generierten Code herausfinden .Bei Generika ist die klassische Verwendung das
TryGetValue
Muster:public static bool TryGetValue(string key, out T value) { if(canFindIt) { value = ...; return true; } value = default(T); return false; }
Hier wir haben einen Wert zuweisen , das Verfahren zu beenden, aber der Anrufer soll nicht wirklich, was es ist. Sie können dies der Konstruktoreinschränkung gegenüberstellen:
public static T CreateAndInit<T>() where T : ISomeInterface, new() { T t = new T(); t.SomeMethodOnInterface(); return t; }
quelle
Das Standardschlüsselwort hat je nach Verwendungskontext unterschiedliche Semantiken.
Die erste Verwendung erfolgt im Kontext einer switch-Anweisung, die seit C # 1.0 verfügbar ist:
http://msdn.microsoft.com/en-us/library/06tc147t(VS.80).aspx
Die zweite Verwendung erfolgt im Zusammenhang mit Generika beim Initialisieren einer generischen Typinstanz, die seit C # 2.0 verfügbar ist:
http://msdn.microsoft.com/en-us/library/xwth0h0d(VS.80).aspx
quelle
Das Schlüsselwort "default" (abgesehen von "switch-case") hilft Ihnen beim Initialisieren der Instanz eines Objekts wie Klasse, Liste und weiterer Typen. Es wird aufgrund seiner generischen Eigenschaft verwendet, mit der Sie den Standardwert des Typs zuweisen können, wenn Sie ihn nicht kennen Wert als Fortschritt, um Fehler in Ihrem weiteren (zukünftigen) Code zu vermeiden.
quelle
Echo und Hervorhebung seiner Verwendung in Generika und wenig anderem als der Codegenerierung.
Wenn Sie auf Standard initialisieren müssen (in meinem Buch schon verdächtig stinkend), seien Sie klar. TU es einfach.
quelle