Ich habe eine Frage zu Programmierstil und C# -Sprachendesign im Allgemeinen. Ich würde gerne wissen, ob es einen besseren Weg gibt, das zu tun, was ich mache.C# Nested null checks in if Anweisungen
Wenn Sie ein komplexes Datenobjekt haben, mit Eigenschaften, die null sein können, aber Sie wollen auf Daten überprüfen oder zu betreiben, wenn es da ist, kann man keine Zeile schreiben wie so
if(Myobject.MyNestedObject != null || Myobject.MyNestedObject.Property != null)
{
//code
}
Da der Compiler Rufen Sie beide Codezeilen tatsächlich auf, um die if-Anweisung auszuwerten.
Stattdessen muss man (glaube ich) schreiben:
if(Myobject.MyNestedObject != null)
{
if(Myobject.MyNestedObject.Property != null)
{
//code
}
}
Gibt es eine bessere Art als das? Ich versuche, darüber nachzudenken, wie man null coalesce (??) verwendet, aber es würde immer noch werfen, wenn Sie versuchen, etwas von MyNestedObject in derselben Anweisung zu verwenden.
Weitere Informationen:
L_01b4: ldarg.1
L_01b5: callvirt instance class [Myassembly]MyClass.MyObject [MyAssembly]MyClass::get_MyObject()
L_01ba: brtrue.s L_01cc
L_01bc: ldarg.1
L_01bd: callvirt instance class [MyAssembly]MyClass.MyObject [MyAssembly]MyClass::get_MyObject()
L_01c2: callvirt instance class [MyAssembly]MyClass.MyNestedObject [MyAssembly]MyClass.MyNestedObject::get_MyNestedObject()
L_01c7: ldnull
L_01c8: ceq
L_01ca: br.s L_01cd
L_01cc: ldc.i4.0
L_01cd: stloc.2
L_01ce: ldloc.2
L_01cf: brtrue L_0285
L_01d4: nop
Von meinem Verständnis es sagt, dass bei L_01ba, wenn der Anruf true zurückgibt, nicht null oder nicht-0 (dh, wenn das Objekt null ist, wird die Verzweigung nicht genommen und dann Kontrollfluss läuft linear weiter). Dies wird dann natürlich L_01c2 ausführen, was eine Null-Referenz-Ausnahme auslöst, da Myclass.MyObject Null ist.
Habe ich etwas verpasst. Dies ist der .NET 3.5 C# -Compiler.
Eine gute Nachtruhe macht was blutig offensichtlich sein sollte. Indem man die zwei Zeilen schreibt, führt es effektiv aus, was die Operation und die Operation macht. – Spence