Angenommen, Sie möchten in C # einen Wert von PropertyC in diesem Beispiel abrufen, und ObjectA, PropertyA und PropertyB können alle null sein.
ObjectA.PropertyA.PropertyB.PropertyC
Wie kann ich PropertyC mit der geringsten Menge an Code sicher erhalten?
Im Moment würde ich überprüfen:
if(ObjectA != null && ObjectA.PropertyA !=null && ObjectA.PropertyA.PropertyB != null)
{
// safely pull off the value
int value = objectA.PropertyA.PropertyB.PropertyC;
}
Es wäre schön, so etwas mehr zu machen (Pseudocode).
int value = ObjectA.PropertyA.PropertyB ? ObjectA.PropertyA.PropertyB : defaultVal;
Möglicherweise ist er mit einem Null-Koaleszenz-Operator noch weiter zusammengebrochen.
BEARBEITEN Ursprünglich sagte ich, mein zweites Beispiel sei wie js, aber ich habe es in Pseudo-Code geändert, da richtig darauf hingewiesen wurde, dass es in js nicht funktionieren würde.
ObjectA
oder wenn siePropertyA
null sind.Antworten:
In C # 6 können Sie den Null-Bedingungsoperator verwenden . Der ursprüngliche Test lautet also:
quelle
value
gleich wennPropertyC
null ist? oder wennPropertyB
ist null? Was ist, wennObject A
Null ist?null
. Es beginnt von links nach rechts. Ohne den syntaktischen Zucker entspricht dies einer Reihe von if-Anweisungen, beiif(propertyX == null) {value = null} else if (propertyY == null){ value = null} else if......
denen der letzte Ausdruckif(propertyZ != null) { value = propertyZ }
Kurze Verlängerungsmethode:
Verwenden von
Diese einfache Erweiterungsmethode und vieles mehr finden Sie unter http://devtalk.net/csharp/chained-null-checks-and-the-maybe-monad/
BEARBEITEN:
Nachdem ich es für einen Moment benutzt habe, denke ich, dass der richtige Name für diese Methode IfNotNull () anstelle von original With () sein sollte.
quelle
Können Sie Ihrer Klasse eine Methode hinzufügen? Wenn nicht, haben Sie über die Verwendung von Erweiterungsmethoden nachgedacht? Sie können eine Erweiterungsmethode für Ihren Objekttyp mit dem Namen erstellen
GetPropC()
.Beispiel:
Verwendung:
Dies setzt übrigens voraus, dass Sie .NET 3 oder höher verwenden.
quelle
Die Art und Weise, wie Sie es tun, ist richtig.
Sie können einen Trick wie den hier beschriebenen mit Linq-Ausdrücken verwenden:
Aber es ist viel langsamer, jede Eigenschaft manuell zu überprüfen ...
quelle
Refactor zur Einhaltung des Demeter-Gesetzes
quelle
Update 2014: C # 6 hat einen neuen Operator
?.
namens "Sichere Navigation" oder "Null-Propagierung".Weitere Informationen finden Sie unter http://blogs.msdn.com/b/jerrynixon/archive/2014/02/26/at-last-c-is-getting-sometimes-called-the-safe-navigation-operator.aspx
Dies ist seit langem eine äußerst beliebte Anfrage: https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/3990187-add-operator-to-c-?tracking_code=594c10a522f8e9bc987ee4a5e2c0b38d
quelle
Sie suchen offensichtlich nach der Nullable Monad :
wird
Dies gibt zurück
null
, wenn eine der nullbaren Eigenschaften null ist. Andernfalls wird der Wert vonValue
.LINQ-Erweiterungsmethoden:
quelle
SelectMany
Erweiterungsmethode wird von derfrom ... in ... from ... in ...
Syntax verwendet.Angenommen, Sie haben leere Werte vom Typ. Ein Ansatz wäre folgender:
Ich bin ein großer Fan von C #, aber eine sehr schöne Sache in neuem Java (1.7?) Ist das.? Operator:
quelle
Dieser Code ist "die geringste Menge an Code", aber nicht die beste Vorgehensweise:
quelle
Wenn ich solche Aufrufe verketten muss, verlasse ich mich auf eine von mir erstellte Hilfsmethode, TryGet ():
In Ihrem Fall würden Sie es so verwenden:
quelle
Ich habe etwas in der neuen C # 6.0 gesehen, dies ist mit '?' anstatt zu überprüfen
zum Beispiel anstatt zu verwenden
Sie verwenden einfach
Ich hoffe es hat jemandem geholfen.
AKTUALISIEREN:
Das könntest du jetzt so machen
quelle
Sie könnten dies tun:
Oder noch besser könnte dies sein:
quelle
Sie können die folgende Erweiterung verwenden und ich finde es wirklich gut:
Und es wird so verwendet:
quelle
Ich würde Ihre eigene Methode im Typ PropertyA (oder eine Erweiterungsmethode, wenn es nicht Ihr Typ ist) unter Verwendung des ähnlichen Musters wie der Typ Nullable schreiben.
quelle
Bin gerade über diesen Beitrag gestolpert.
Vor einiger Zeit habe ich in Visual Studio Connect einen Vorschlag zum Hinzufügen eines neuen
???
Operators gemacht.http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/4104392-add-as-an-recursive-null-reference-check-opera
Dies würde einige Arbeit vom Framework-Team erfordern, aber nicht die Sprache ändern, sondern nur etwas Compiler-Magie ausführen. Die Idee war, dass der Compiler diesen Code ändern sollte (Syntax nicht erlaubt atm)
in diesen Code
Bei einer Nullprüfung könnte dies so aussehen
quelle
Ich habe eine Methode geschrieben, die einen Standardwert akzeptiert. So verwenden Sie ihn:
Hier ist der Code:
quelle
Es ist nicht möglich.
ObjectA.PropertyA.PropertyB
schlägt fehl, wennObjectA
null aufgrund einer Null-Dereferenzierung vorliegt, was ein Fehler ist.if(ObjectA != null && ObjectA.PropertyA
... funktioniert aufgrund eines Kurzschlusses, dhObjectA.PropertyA
wird nie überprüft, ob dies der FallObjectA
istnull
.Der erste Weg, den Sie vorschlagen, ist der beste und klarste mit Absicht. Wenn überhaupt, könnten Sie versuchen, neu zu gestalten, ohne sich auf so viele Nullen verlassen zu müssen.
quelle
Dieser Ansatz ist ziemlich unkompliziert, sobald Sie den Lambda-Gobbly-Gook überwunden haben:
Bei Verwendung könnte das so aussehen:
quelle
Der
??
(Null-Koaleszenz-Operator) bedeutet, wenn das erste Argument lautetnull
, geben Sie stattdessen das zweite zurück.quelle