Null-Koaleszenz bedeutet ungefähr return x, unless it is null, in which case return y
Ich brauche oft return null if x is null, otherwise return x.y
ich kann nutzen return x == null ? null : x.y;
Nicht schlecht, aber das null
in der Mitte stört mich immer - es scheint überflüssig. Ich würde so etwas bevorzugen return x :: x.y;
, wo das, was folgt ::
, nur ausgewertet wird, wenn das, was davor steht, nicht ausgewertet wird null
.
Ich sehe dies fast als das Gegenteil von Null-Koaleszenz, gemischt mit einem knappen Inline-Null-Check, aber ich bin [ fast] ] sicher, dass es in C # keinen solchen Operator gibt.
Gibt es andere Sprachen, die einen solchen Operator haben? Wenn ja, wie heißt es?
(Ich weiß, dass ich eine Methode dafür in C # schreiben kann; ich verwende return NullOrValue.of(x, () => x.y);
, aber wenn Sie etwas Besseres haben, würde ich das auch gerne sehen.)
return x ? x.y : NULL
. Yay für die Konvertierung von Zeigertypen in Boolesche Werte!Antworten:
Es gibt den nullsicheren DereferenzierungsoperatorIn Groovy (?.) ... Ich denke, das ist es, wonach Sie suchen.
(Es wird auch als sicherer Navigationsoperator bezeichnet .)
Beispielsweise:
Dies ergibt null, wenn
person
,person.homeAddress
oderperson.homeAddress.postcode
ist null.(Dies ist jetzt in C # 6.0 verfügbar, jedoch nicht in früheren Versionen.)
quelle
null
:def bar = foo ?: "<null>"
Decimal? post = pre == null ? null : SomeMethod( pre );
. Es wäre schön, wenn ich es auf "Decimal? Post = pre :: SomeMethod (pre);" reduzieren könnte.Wir haben darüber nachgedacht,? zu C # 4. Es hat den Schnitt nicht geschafft; Es ist eine "nice to have" -Funktion, keine "gotta have" -Funktion. Wir werden es für hypothetische zukünftige Versionen der Sprache noch einmal in Betracht ziehen, aber ich würde nicht den Atem anhalten und warten, wenn ich Sie wäre. Mit der Zeit wird es wahrscheinlich nicht mehr entscheidend. :-)
quelle
Wenn Sie eine spezielle Art von boolescher Kurzschlusslogik haben, können Sie dies tun (Javascript-Beispiel):
Wenn
x
null ist, wird es nicht ausgewertetx.y
.quelle
Es fühlte sich einfach richtig an, dies als Antwort hinzuzufügen.
Ich denke, der Grund, warum es so etwas in C # nicht gibt, liegt darin, dass die umgekehrte Operation im Gegensatz zum Koaleszenzoperator (der nur für Referenztypen gültig ist) entweder einen Referenz- oder einen Werttyp (dh
class x
mit Mitglied) ergeben könnteint y
- daher wäre dies leider der Fall in vielen Situationen unbrauchbar.Ich sage jedoch nicht, dass ich es nicht sehen möchte!
Eine mögliche Lösung für dieses Problem wäre, dass der Bediener einen Werttypausdruck auf der rechten Seite automatisch auf null setzt. Aber dann haben Sie das Problem, dass,
x.y
wenn y ein int ist, tatsächlich ein zurückgegeben wirdint?
was ein Schmerz wäre.Eine andere, wahrscheinlich bessere Lösung wäre, dass der Operator den Standardwert (dh null oder null) für den Typ auf der rechten Seite zurückgibt, wenn der Ausdruck auf der linken Seite null ist. Aber dann haben Sie Probleme bei der Unterscheidung von Szenarien, aus denen tatsächlich eine Null / Null gelesen wurde
x.y
oder ob sie vom Operator für sicheren Zugriff bereitgestellt wurde.quelle
int?
als Standardrückgabewert, und der Benutzer kann ihn in ein int ändern, wenn er möchte. Zum Beispiel, wenn ich eine MethodeLookup
mit einem Standardwert von -1 aufrufen möchte, falls eine meiner Referenzen lautetnull
:foo?.Bar?.Lookup(baz) ?? -1
?. :
mit einem ternären Operator, bei dem die rechte Seite vom gleichen Typ sein muss wie das entsprechende Element in der Mitte?Delphi hat den Operator: (anstatt.), Der nullsicher ist.
Sie dachten darüber nach, ein? Operator auf C # 4.0, um dasselbe zu tun, aber das hat den Hackklotz bekommen.
In der Zwischenzeit gibt es IfNotNull (), welche Art von Kratzern juckt . Es ist sicherlich größer als? oder :, aber Sie können damit eine Kette von Operationen erstellen, die keine NullReferenceException bei Ihnen verursachen, wenn eines der Mitglieder null ist.
quelle
?.
ist eine C # 6.0-Sprachfunktion, und ja, es macht genau das, was das OP hier verlangt hat. Besser spät als nie ^^In Haskell können Sie den
>>
Operator verwenden:Nothing >> Nothing
istNothing
Nothing >> Just 1
istNothing
Just 2 >> Nothing
istNothing
Just 2 >> Just 1
istJust 1
quelle
Haskell hat
fmap
, was in diesem Fall meiner Meinung nach gleichwertig istData.Maybe.map
. Haskell ist rein funktional, also was Sie suchen, wäreWenn
x
istNothing
, diese zurückkehrtNothing
. Wennx
istJust object
, diese zurückkehrtJust (select_y object)
. Nicht so hübsch wie die Punktnotation, aber da es sich um eine funktionale Sprache handelt, sind die Stile unterschiedlich.quelle
Mit PowerShell können Sie Eigenschaften (aber keine Aufrufmethoden) für eine Nullreferenz referenzieren. Wenn die Instanz null ist, wird null zurückgegeben. Sie können dies in jeder Tiefe tun. Ich hatte gehofft, dass die dynamische Funktion von C # 4 dies unterstützen würde, aber dies ist nicht der Fall.
Es ist nicht schön, aber Sie könnten eine Erweiterungsmethode hinzufügen, die so funktioniert, wie Sie es beschreiben.
quelle
Ich brauche diese Logik oft für Strings:
quelle
Erstellen Sie irgendwo eine statische Instanz Ihrer Klasse mit den richtigen Standardwerten für die Mitglieder.
Beispielsweise:
dann statt deiner
Du kannst schreiben
quelle
Dies wird in C # vNext hinzugefügt (Roslyn powered C #, Releases mit Visual Studio 2014).
Es heißt Null-Propagation und wird hier als vollständig aufgeführt. https://roslyn.codeplex.com/wikipage?title=Language%20Feature%20Status
Es wird auch hier als vollständig aufgeführt: https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/3990187-add-operator-to-c
quelle
Der sogenannte "nullbedingte Operator" wurde in C # 6.0 und in Visual Basic 14 eingeführt.
In vielen Situationen kann er als genaues Gegenteil des nullkoaleszierenden Operators verwendet werden:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-conditional-operators
quelle