2013-03-01 19 views
5

Come ho capito e letto, è possibile utilizzare il cortocircuito in istruzione if (& & o ||) in modo che la seconda condizione non venga attivata. e se vuoi che entrambe le condizioni si attivino, useresti i singoli operandi (& o |).Istruzione Inline If - cortocircuito

Così dicono se devo linea if come di seguito:

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

Ciò gettare object reference errore se MyObject è nullo, che a mio parere non dovrebbe come sto usando corto circuito. Qualcuno può spiegare questo per favore.

+3

You' manca una parentesi chiusa prima del '?'. – Corak

+0

@Corak si è perso l'ultima parentesi ...modificato ora – Zaki

risposta

13

Si sta utilizzando la condizione sbagliata. Questa parte:

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

dovrebbe essere:

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

L'RHS di un || eseguita solo se la mano sinistra è falsa. Si desidera eseguire solo se MyObject è non null.

EDIT: Se si vuole veramente la parte MyObject != null, è possibile modificare il tutto a:

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

nota l'inversione del 2 ° e 3 ° operandi dell'operatore condizionale troppo però.

+0

ah vedo così se faccio && per la stessa condizione invece di || dovrebbe andare bene – Zaki

+0

@ Sam1: beh, avresti bisogno di invertire anche altri bit di esso. –

+0

grazie ora è chiaro: P – Zaki

3

si dovrebbe avere un == non un =

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

Prova questa:

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

Qui dire.

Se il mio oggetto non è nullo. o string.IsNullOrEmpty (MyObject.Property)

Ciò significa che se MyObject è nullo, tenterà di eseguire la seconda parte.

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

questo non gettare eccezione nullo

2

Ciò avviene perché è MyObjectnull e quindi la prima condizione è false così la seconda parte deve essere valutato per conoscere tutta la condizione. Modificare la riga a questo:

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

si dovrebbe preferire la leggibilità anziché la linea-count, ad esempio:

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

(il motivo della vostra eccezione è stata già spiegato in altre risposte)

+0

il conteggio delle linee non è sempre l'obiettivo. Ad esempio, all'interno di un Lamda/predicato, forzare l'uso di '{' & '}' e anche un ritorno esplicito può essere altrettanto illeggibile. – JoeBrockhaus