C# eleganter Weg, um zu überprüfen, ob eine Eigenschaft die Eigenschaft den Wert null
In C#, sagen Sie, dass Sie möchten, ziehen Sie einen Wert aus der PropertyC in diesem Beispiel und ObjectA, PropertyA und PropertyB können alle null sein.
ObjectA.PropertyA.PropertyB.PropertyC
Wie bekomme ich PropertyC sicher mit der geringsten Menge an code?
Recht jetzt 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;
}
Wäre es schön, etwas zu tun, mehr so aus (pseudo-code).
int value = ObjectA.PropertyA.PropertyB ? ObjectA.PropertyA.PropertyB : defaultVal;
Möglicherweise sogar noch weiter, brach mit null-coalescing operator.
BEARBEITEN Ursprünglich sagte ich meinem zweiten Beispiel war wie js, aber ich geändert, um Pseudo-code, da es wurde richtig darauf hingewiesen, dass es nicht funktionieren würde, in js.
InformationsquelleAutor der Frage Jon Kragh | 2010-08-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
In C# 6 können Sie den Null-Conditional Operator. Also der eigentliche test wird sein:
InformationsquelleAutor der Antwort Phillip Ngan
Kurze Extension Methode:
Mit
Diese einfache Erweiterung Methode und vieles mehr finden Sie auf http://devtalk.net/csharp/chained-null-checks-and-the-maybe-monad/
EDIT:
Nachdem es ihn für den moment denke ich, der richtige name für diese Methode sollte IfNotNull() statt original Mit().
InformationsquelleAutor der Antwort Krzysztof Morcinek
Hinzufügen Sie können eine Methode, um Ihre Klasse? Wenn nicht, haben Sie sich Gedanken über die Verwendung von extension-Methoden? Sie könnten eine Erweiterung-Methode für das Objekt-Typ aufgerufen
GetPropC()
.Beispiel:
Verwendung:
Durch die Art und Weise, dies setzt Voraus, die Sie verwenden .NET 3 oder höher.
InformationsquelleAutor der Antwort Sam
Die Art und Weise Sie es tun, richtig ist.
Du könnte verwenden einen trick, wie beschrieben,hiermithilfe von Linq-Ausdrücke :
Aber es ist viel langsamer, manuell überprüfen jede Eigenschaft...
InformationsquelleAutor der Antwort Thomas Levesque
Umgestalten zu beobachten, die Gesetz von Demeter
InformationsquelleAutor der Antwort rtalbot
Du bist offensichtlich auf der Suche für die Nullable-Monade:
wird
Zurück
null
wenn die nullable-Eigenschaften null ist; andernfalls wird der Wert vonValue
.LINQ extension Methoden:
InformationsquelleAutor der Antwort dtb
Update 2014: C# 6 hat einen neuen Betreiber
?.
verschiedene genannte "sichere navigation" oder "null-Vermehrung'Lesen http://blogs.msdn.com/b/jerrynixon/archive/2014/02/26/at-last-c-is-getting-sometimes-called-the-safe-navigation-operator.aspx für details
Dies ist seit langem eine sehr beliebte Anfrage
https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/3990187-add-operator-to-c-?tracking_code=594c10a522f8e9bc987ee4a5e2c0b38d
InformationsquelleAutor der Antwort Colonel Panic
Dieser code ist "the least amount of code", aber nicht die beste Praxis:
InformationsquelleAutor der Antwort Boris Modylevsky
Vorausgesetzt, Sie haben leere Werte der Typen ein Ansatz wäre dies:
Ich bin ein großer fan von C#, aber eine sehr schöne Sache in new-Java (1.7?) ist das .? Betreiber:
InformationsquelleAutor der Antwort Just another metaprogrammer
Überprüfen in diesem blog-post aus. Ich denke, es ist eine sehr elegante Methode für verkettete null prüft. Es gibt viele ähnliche Implementierungen, aber diese mag ich, weil es Stoppt die Auswertung, sobald eine null gefunden wird, die in der Kette.
Allem der source-code ist auf github.
InformationsquelleAutor der Antwort codeConcussion
Wenn ich brauche, um die Kette fordert so, ich verlasse mich auf eine helper-Methode, die ich erstellt, TryGet():
In Ihrem Fall, verwenden Sie es so auf:
InformationsquelleAutor der Antwort Emanuel
Sah ich etwas in der neuen C# 6.0,
dies ist durch die Verwendung von '?' anstelle der überprüfung
anstatt z.B.
verwenden Sie einfach
Ich hoffe, es half jemand.
UPDATE:
Könnten Sie tun, wie dieser jetzt
InformationsquelleAutor der Antwort iYazee6
Könnte man dies tun:
Oder sogar besser sein könnte:
InformationsquelleAutor der Antwort Jeffrey L Whitledge
Ist es nicht möglich. ObjectA.PropertyA.PropertyB fehl, wenn ObjectA null ist, wegen null-Dereferenzierung, das ist ein Fehler.
if(ObjectA != null && ObjectA.PropertyA ... funktioniert durch Kurzschluss, dh ObjectA.PropertyA wird nie überprüft werden, ob ObjectA null ist.
Die erste Möglichkeit, die Sie vorschlagen, ist die beste und die meisten klar mit Vorsatz. Wenn alles, was Sie konnte umgestalten, um die zimmerreserviereung, ohne das Vertrauen auf die so viele null-Werte.
InformationsquelleAutor der Antwort DanDan
Stolperte über diesen Beitrag.
Habe ich vor einiger Zeit den Vorschlag gemacht, auf Visual Studio-Verbinden über das hinzufügen eines neuen
???
Betreiber.http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/4104392-add-as-an-recursive-null-reference-check-opera
Dies würde erfordern einige arbeiten aus dem framework-team, müssen aber nicht zu ändern die Sprache, sondern nur einige compiler-magic. Die Idee war, dass der compiler sollte dies ändern-code (syntax nicht erlaubt atm)
in diesem code
Null-überprüfen Sie das Aussehen könnte
InformationsquelleAutor der Antwort Jürgen Steinblock
können Sie die folgenden Erweiterung und ich denke, es ist wirklich gut:
Und es wird wie folgt verwendet:
InformationsquelleAutor der Antwort Tony
Null Ausbreitung geplant in C# vNext, powered by Roslyn
Nicht eine Antwort, sondern eher ein update. Es scheint, als ob UserVoice getrieben hat, zusammen mit vielen anderen neuen Dingen, denn Roslyn und ist offenbar eine geplante Ergänzung:
https://roslyn.codeplex.com/discussions/540883
InformationsquelleAutor der Antwort Adam Houldsworth
Ich würde schreiben Sie Ihre eigene Methode in der Art der PropertyA (oder eine Erweiterung Methode, wenn es nicht Ihre Art) mit dem ähnlichen Muster auf die Nullable-Typ.
InformationsquelleAutor der Antwort Steve Danner
Schrieb ich eine Methode akzeptiert einen default-Wert, hier ist, wie es zu benutzen:
Hier ist der code:
InformationsquelleAutor der Antwort Akira Yamamoto
Dieser Ansatz ist ziemlich straight-forward-sobald man über die lambda-gobbly-gook:
Nutzung das Aussehen könnte:
InformationsquelleAutor der Antwort BlackjacketMack
????? operator bedeutet, wenn das erste argument null ist, zurückkehren, der zweite statt.
InformationsquelleAutor der Antwort Aridane Álamo