2013-03-01 9 views
5

Wie ich verstanden und gelesen habe, können Sie in if-Anweisung einen Kurzschluss verwenden (& & oder ||), damit die zweite Bedingung nicht ausgelöst wird. Wenn Sie beide Bedingungen auslösen möchten, verwenden Sie einzelne Operanden (& oder |). SoInline If-Anweisung - kurzschließen

sagen, wenn ich Inline-if-Anweisung habe, wie unten:

var test = (MyObject != null || string.IsNullOrEmpty(MyObject.Property)) ? string.Empty : MyObject.Property; 

Diese object reference Fehler ausgelöst wird, wenn MyObject null ist, was meiner Meinung nach nicht, wie ich Kurzschlüsse verwendet. Kann mir bitte jemand das erklären.

+3

Sie‘ Es fehlt eine schließende Klammer vor dem '?' – Corak

+0

@Corak ja verpasste die letzte Klammer ...jetzt bearbeitet – Zaki

Antwort

13

Sie verwenden die falsche Bedingung. Dieser Teil:

MyObject != null || string.IsNullOrEmpty(MyObject.Property) 

sollte sein:

MyObject == null || string.IsNullOrEmpty(MyObject.Property) 

Die RHS eines || führt nur dann, wenn die linke Hand falsch ist. Sie möchten, dass es nur ausgeführt wird, wenn MyObjectnicht null ist. Auch wenn

var test = MyObject != null && !string.IsNullOrEmpty(MyObject.Property) 
     ? MyObject.Property : ""; 
die Umkehrung des zweiten und dritten Operanden des Konditionaloperator

Hinweis:

EDIT: Wenn Sie wirklich das MyObject != null Teil wollen, könnten Sie die ganze Sache ändern. !

+0

ah sehe ich so, wenn ich && für die gleiche Bedingung anstelle von || es sollte in Ordnung sein – Zaki

+0

@ Sam1: Nun, Sie müssten andere Bits davon auch umgekehrt. –

+0

danke es ist jetzt klar: P – Zaki

3

Sie sollten eine == keine haben =

var test = (MyObject == null || string.IsNullOrEmpty(MyObject.Property) ? string.Empty : MyObject.Property 
2

Try this:

var test = (MyObject == null || string.IsNullOrEmpty(MyObject.Property) 
      ? string.Empty : MyObject.Property 
2
MyObject != null || string.IsNullOrEmpty(MyObject.Property) 

Hier sagen Sie.

Wenn mein Objekt nicht null ist. oder string.IsNullOrEmpty (MyObject.Property)

Das bedeutet, wenn MyObject ist null wird er versuchen, den zweiten Teil auszuführen.

MyObject == null || string.IsNullOrEmpty(MyObject.Property) 

Dies wird nicht null Ausnahme

2

werfen Das geschieht, weil MyObjectnull ist und daher die erste Bedingung ist false so der zweite Teil ausgewertet werden müssen, die Gesamtheit der Bedingung wissen. Ändern Sie die Zeile dazu:

MyObject != null && string.IsNullOrEmpty(MyObject.Property) 
1

sollten Sie bevorzugen Lesbarkeit anstelle von Linienzählung, zB:

string prop = string.Empty; 
if(MyObject != null && MyObject.Property != null) 
    prop = MyObject.Property; 

(der Grund für Ihre Ausnahme wurde bereits in anderen Antworten erklärt)

+0

Zeilenanzahl ist nicht immer das Ziel. Zum Beispiel kann innerhalb eines Lamda/Prädikats die Verwendung von '{' & '}' und auch eine explizite Rückkehr genauso unlesbar sein. – JoeBrockhaus