Ich weiß, dass die Standardmethode für die Verwendung des Null-Koaleszenzoperators in C # darin besteht, Standardwerte festzulegen.
string nobody = null;
string somebody = "Bob Saget";
string anybody = "";
anybody = nobody ?? "Mr. T"; // returns Mr. T
anybody = somebody ?? "Mr. T"; // returns "Bob Saget"
Aber wofür kann ??
man sonst noch verwenden? Es scheint nicht so nützlich zu sein wie der ternäre Operator, abgesehen davon, dass es prägnanter und leichter zu lesen ist als:
nobody = null;
anybody = nobody == null ? "Bob Saget" : nobody; // returns Bob Saget
Angesichts der Tatsache, dass weniger über den Null-Koaleszenz-Operator Bescheid wissen ...
Hast du
??
für etwas anderes verwendet?Ist
??
notwendig, oder sollten Sie nur den ternären Operator verwenden (mit dem die meisten vertraut sind)
c#
coding-style
null
conditional-operator
null-coalescing-operator
Armstrongest
quelle
quelle
Ich habe es als Lazy Load One-Liner verwendet:
Lesbar? Entscheide dich selbst.
quelle
Ich habe es auf zwei "etwas merkwürdige" Arten nützlich gefunden:
out
Parameter beim Schreiben vonTryParse
Routinen (dh Rückgabe des Nullwerts, wenn die Analyse fehlschlägt)Letzteres benötigt etwas mehr Informationen. Wenn Sie einen Vergleich mit mehreren Elementen erstellen, müssen Sie normalerweise prüfen, ob der erste Teil des Vergleichs (z. B. Alter) eine endgültige Antwort liefert, und der nächste Teil (z. B. Name) nur, wenn der erste Teil nicht geholfen hat. Wenn Sie den Null-Koaleszenz-Operator verwenden, können Sie ziemlich einfache Vergleiche schreiben (ob zur Reihenfolge oder zur Gleichheit). Verwenden Sie beispielsweise einige Hilfsklassen in MiscUtil :
Zugegeben, ich habe jetzt ProjectionComparer in MiscUtil, zusammen mit einigen Erweiterungen, die so etwas noch einfacher machen - aber es ist immer noch ordentlich.
Dasselbe kann für die Überprüfung der Referenzgleichheit (oder Nullheit) zu Beginn der Implementierung von Gleichheit durchgeführt werden.
quelle
Ein weiterer Vorteil besteht darin, dass der ternäre Operator eine doppelte Auswertung oder eine temporäre Variable benötigt.
Betrachten Sie dies zum Beispiel:
Während Sie mit dem ternären Operator arbeiten, bleibt Ihnen entweder Folgendes übrig:
das MyMethod zweimal aufruft, oder:
In beiden Fällen ist der Null-Koaleszenz-Operator sauberer und effizienter.
quelle
MyMethod()
irgendwelche Nebenwirkungen haben.MyMethod()
sich außerhalb der Rückgabe eines Werts keine Auswirkungen ergeben, kann der Compiler ihn nicht zweimal aufrufen, sodass Sie sich hier in den meisten Fällen wirklich keine Gedanken über die Effizienz machen müssen.MyMethod()
es sich um eine verkettete Folge von gepunkteten Objekten handelt. Beispiel:myObject.getThing().getSecondThing().getThirdThing()
MyMethod
in diesem Zusammenhang identisch sind, sofern es sichMyMethod
um eine Pure-Funktion handelt. Eine andere Option ist das automatische Speichern oder das Schließen der Funktion im Cache. Auf der anderen Seite: en.wikipedia.org/wiki/Global_value_numberingEine andere zu berücksichtigende Sache ist, dass der Koaleszenzoperator die get-Methode einer Eigenschaft nicht zweimal aufruft, wie dies beim ternären Operator der Fall ist.
Es gibt also Szenarien, in denen Sie ternär nicht verwenden sollten, zum Beispiel:
Wenn du benutzt:
Der Getter wird zweimal aufgerufen und die
count
Variable ist gleich 2, und wenn Sie verwenden:Die
count
Variable ist wie gewünscht gleich 1.quelle
??
ist äquivalent zu?:
.Der größte Vorteil, den ich für den
??
Operator finde, besteht darin, dass Sie nullbare Werttypen leicht in nicht nullbare Typen konvertieren können:Ich verwende dies häufig in Linq-Abfragen:
quelle
kvp == null
. Und hat tatsächlichNullable<T>
eineGetValueOrDefault
Methode, die ich normalerweise benutze.Ich habe verwendet? in meiner Implementierung von IDataErrorInfo:
Wenn sich eine einzelne Eigenschaft in einem "Fehler" -Zustand befindet, wird dieser Fehler angezeigt, andernfalls wird null angezeigt. Funktioniert sehr gut.
quelle
this["Name"]
,this["Address"]
etc ??Sie können den Null-Koaleszenz-Operator verwenden, um den Fall, in dem kein optionaler Parameter festgelegt ist, etwas sauberer zu gestalten:
quelle
arg ?= Arg.Default
?Ich verwende gerne den Null-Koaleszenz-Operator, um bestimmte Eigenschaften verzögert zu laden.
Ein sehr einfaches (und erfundenes) Beispiel, um meinen Standpunkt zu veranschaulichen:
quelle
Tatsächlich ist meine Erfahrung, dass allzu wenige Menschen mit dem ternären Operator (oder genauer gesagt dem bedingten Operator) vertraut sind . Er
?:
ist "ternär" im gleichen Sinne wie||
binär oder+
entweder unär oder binär ist; es ist jedoch zufällig der nur ternärer Operator in vielen Sprachen), so dass zumindest in dieser begrenzten Stichprobe Ihre Aussage genau dort fehlschlägt.Wie bereits erwähnt, gibt es auch eine wichtige Situation, in der der Null-Koaleszenz-Operator sehr nützlich ist, und zwar immer dann, wenn der auszuwertende Ausdruck überhaupt Nebenwirkungen hat. In diesem Fall können Sie den bedingten Operator nicht verwenden, ohne entweder (a) eine temporäre Variable einzuführen oder (b) die tatsächliche Logik der Anwendung zu ändern. (b) ist eindeutig unter keinen Umständen angemessen, und obwohl es eine persönliche Präferenz ist, mag ich es nicht, den Deklarationsumfang mit vielen fremden, wenn auch kurzlebigen Variablen zu überladen, so dass (a) auch darin herauskommt bestimmtes Szenario.
Wenn Sie das Ergebnis mehrfach überprüfen müssen, ist der bedingte Operator oder eine Reihe von
if
Blöcken wahrscheinlich das Werkzeug für den Job. Aber für einfache "Wenn dies null ist, verwenden Sie das, andernfalls verwenden Sie es", ist der Null-Koaleszenzoperator??
perfekt.quelle
Eine Sache, die ich in letzter Zeit viel getan habe, ist die Verwendung von Null-Koaleszenz für Backups
as
. Beispielsweise:Es ist auch nützlich, um lange Ketten zu sichern, von
?.
denen jede fehlschlagen könntequelle
Das einzige Problem ist, dass der Null-Coalesce-Operator keine leeren Zeichenfolgen erkennt.
dh
AUSGABE:
Ich bin gerade dabei, das ?? Betreiber, um dies zu umgehen. Es wäre sicher praktisch, dies in das Framework zu integrieren.
Gedanken?
quelle
??
kann nicht überladen werden: msdn.microsoft.com/en-us/library/8edha89s(v=vs.100).aspx - das wäre allerdings großartig, wenn man es überladen könnte. Ich verwende eine Kombination:s1.Nullify() ?? s2.Nullify()
Dabei wirdstring Nullify(this s)
a zurückgegebennull
, wenn die Zeichenfolge leer ist.Sie sollten das verwenden, was Ihre Absicht am besten ausdrückt. Da ist ein Null - coalesce Operator, es verwenden .
Andererseits denke ich, da es so spezialisiert ist, dass es keine anderen Verwendungszwecke hat. Ich hätte eine angemessene Überlastung des
||
Operators vorgezogen , wie es andere Sprachen tun. Dies wäre im Sprachdesign sparsamer. Aber gut …quelle
Cool! Zählen Sie mich als jemanden, der nichts über den Null-Koaleszenz-Operator wusste - das ist ziemlich raffiniertes Zeug.
Ich finde es viel einfacher zu lesen als der ternäre Operator.
Der erste Ort, an dem ich daran denke, wo ich es verwenden könnte, ist, alle meine Standardparameter an einem einzigen Ort zu speichern.
quelle
Ein seltsamer Anwendungsfall, aber ich hatte eine Methode, bei der ein
IDisposable
Objekt möglicherweise als Argument übergeben wird (und daher vom übergeordneten Element entsorgt wird), aber auch null sein kann (und daher in einer lokalen Methode erstellt und entsorgt werden sollte).Um es zu verwenden, sah der Code entweder so aus
Aber mit einer Nullverschmelzung wird viel ordentlicher
quelle
Ich habe so verwendet:
quelle