2013-03-01 15 views
5

Jak rozumiem i czytam, możesz użyć zwarcia w instrukcji if (& & lub ||), aby drugi warunek nie był uruchamiany. a jeśli chcesz, aby oba warunki zostały uruchomione, użyjesz pojedynczych operandów (& lub |).Inline Jeśli instrukcja - zwarcie

więc powiedzieć, jeśli mam inline if jak poniżej:

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

Ten rzuci object reference błąd, jeśli MyObject jest null, które moim zdaniem nie powinno tak używam zwarciem. Czy ktoś może to wyjaśnić.

+3

You” ponownie brakuje nawiasu zamykającego przed "?". – Corak

+0

@Corak yes przegapił ostatni nawias ...edytowane teraz – Zaki

Odpowiedz

13

Używasz niewłaściwego warunku. Ta część:

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

powinno być:

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

RHS o || wykonywana tylko wtedy, gdy lewa ręka jest fałszywe. Chcesz go wykonać tylko wtedy, gdy MyObject jest nie null.

EDIT: Jeśli naprawdę chcesz MyObject != null część, można zmienić całą rzecz do:

var test = MyObject != null && !string.IsNullOrEmpty(MyObject.Property) 
     ? MyObject.Property : ""; 

Uwaga Odwrócenie 2. i 3. argumentów operatora warunkowego zbyt chociaż.

+0

ah widzę, więc jeśli robię && dla tego samego warunku zamiast || powinno być w porządku – Zaki

+0

@ Sam1: Cóż, musisz odwrócić również inne fragmenty. –

+0

, dzięki czemu jest już jasne: P – Zaki

3

Należy mieć == nie an =

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

Spróbuj tego!

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

Tutaj mówisz.

Jeśli mój obiekt nie jest pusty. lub string.IsNullOrEmpty (MyObject.Property)

Co oznacza, że ​​jeśli MyObject ma wartość null, spróbuje wykonać drugą część.

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

To nie rzuci wyjątku null

2

tak się dzieje, ponieważ MyObject jest null a więc pierwszy warunek jest false więc druga część musi być oceniana poznać całość kondycji. Zmienić linię do tego:

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

powinny Wolisz czytelność zamiast line-count, np

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

(powód dla wyjątku został już wyjaśniony w innych odpowiedzi)

+0

liczenie linii nie zawsze jest celem. Na przykład w Lamdzie/orzeczniku wymuszenie użycia '{' & '}' oraz wyraźnego zwrotu może być równie nieczytelne. – JoeBrockhaus

Powiązane problemy