Stellen Sie sich das folgende typische Szenario vor:
if(myObject == null) {
myObject = new myClass();
}
Ich frage mich, was man von dem folgenden Ersatz mit dem Null-Koaleszenz-Operator hält:
myObject = myObject ?? new myClass();
Ich bin nicht sicher, ob ich das zweite Formular verwenden soll. Es scheint eine nette Abkürzung zu sein, aber das myObject = myObject
Konstrukt am Anfang scheint ein bisschen nach Code zu riechen.
Ist das eine vernünftige Sache, oder gibt es eine bessere Abkürzung, die ich vermisse? Oder vielleicht "Es sind drei Zeilen, komm drüber hinweg!"?
Edit: Wie bereits erwähnt, ist die Bezeichnung eines typischen Szenarios möglicherweise etwas übertrieben. Normalerweise stoße ich auf diese Situation, wenn ich eine Entität aus einer Datenbank mit einer untergeordneten Referenztypeigenschaft abrufe, die möglicherweise noch nicht ausgefüllt ist:
myClass myObject = myClassService.getById(id);
myObject.myChildObject = myObject.myChildObject ?? new myChildClass();
MyClass
sollte es einpublic static readonly
Mitglied einesEmpty
Werts seines Typs liefern . SieheString.Empty
unter MSDN .??=
Operator?Antworten:
Ich benutze die ganze Zeit den Null-Koaleszenz-Operator. Ich mag die Prägnanz davon.
Ich finde, dass dieser Operator dem ternären Operator (A? B: C) ähnelt. Es braucht ein wenig Übung, bevor das Lesen zur Selbstverständlichkeit wird, aber wenn Sie sich erst einmal daran gewöhnt haben, ist die Lesbarkeit meiner Meinung nach besser als bei den Langhandversionen.
Außerdem ist die von Ihnen beschriebene Situation nur ein Szenario, in dem der Bediener nützlich ist. Es ist auch praktisch, Konstrukte wie das folgende zu ersetzen:
oder
mit
quelle
myObject = myObject2 ?? myObject3
. Ich frage mich insbesondere, ob der Operator verwendet wird, um ein Objekt auf sich selbst zu setzen, es sei denn, es ist null.null
ein Vergleich sein könnte.Das
?? operator
wird als Nullkoaleszenzoperator bezeichnet und wird zum Definieren eines Standardwerts für nullfähige Werttypen oder Referenztypen verwendet. Es gibt den linken Operanden zurück, wenn der Operand nicht null ist. Andernfalls wird der richtige Operand zurückgegeben.myObject = myObject ?? new myObject();
-instantiate default value of object
Weitere Details und Codebeispiele zum Null-Koaleszenz-Operator - MSDN-Artikel .
Wenn Sie die
more than nullable
Bedingung überprüfen , können Sie alternativ den ternären Operator verwenden.Ternärer Operator
Sie können sich auch Folgendes ansehen : Operator . Es wird ternärer oder bedingter Operator genannt. Der bedingte Operator (? :) gibt abhängig vom Wert eines Booleschen Ausdrucks einen von zwei Werten zurück.
Ein Codebeispiel von MSDN -?: Operator (C # -Referenz) :
quelle
myObject = (myObject == null) ? new myClass() : myObject
. Wenn ich den bedingten Operator nicht besser verwende, scheint es das gleiche "Problem" zu geben, wenn ein Objekt auf sich selbst gesetzt wird (wenn es nicht null ist) wie der null-koaleszierende Operator - und es ist weniger präzise.Ich denke nicht, dass dieses Szenario typisch ist (oder zumindest sein sollte).
Wenn der Standardwert eines Feldes nicht sein soll
null
, stellen Sie ihn im Feldinitialisierer ein:Wenn die Initialisierung komplizierter ist, legen Sie sie im Konstruktor fest.
Wenn Sie
myClass
nur dann erstellen möchten, wenn Sie es tatsächlich benötigen (z. B. weil das Erstellen sehr lange dauert), können Sie Folgendes verwendenLazy<T>
:(Dies ruft den Standardkonstruktor auf. Wenn die Initialisierung komplizierter ist, übergeben Sie Lambda, das erstellt wird,
myClass
an denLazy<T>
Konstruktor.)Um auf den Wert zuzugreifen, verwenden Sie
myObject.Value
, wodurch die Initialisierung aufgerufen wird, wenn Sie zum ersten Mal auf diesen zugreifenmyObject.Value
.quelle
Ich verwende es besonders gerne
??
in Verbindung mit optionalen Methodenparametern. Ich beschränke die Notwendigkeit von Überladungen und stelle sicher, dass das Ding einen Wert hat.quelle