Was ist die Verwendung des Standardschlüsselworts in C #?

Antworten:

100

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;

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)
    }
}
Andrew Hare
quelle
80

Sie können default verwenden, um auch den Standardwert von a zu erhalten Generic Type.

public T Foo<T>()
{
    .
    .
    .
    return default(T);
}
Mehdi Golchin
quelle
33

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:

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;
}
Marc Gravell
quelle
1
+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.

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

jrista
quelle
4

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.

Prasanna Venkatesh
quelle
0

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.

Rodney
quelle