2012-03-08 9 views
9

Come è possibile utilizzare la condizione ternaria ? : per eseguire più operazioni, se espressione è vero/falso?Utilizzo dell'operatore ternario per più operazioni

wbsource = (exp) ? (Do one thing) : (Do second thing) wbsource = (exp) ? (Do one thing) (Do second thing) : (Do second thing)

Per esempio:

Perché non è possibile eseguire tre operazioni tra ? e :

filename = (fp!=null) ? fp; Properties.Settings.Default.filename=fp; Properties.Settings.Default.Save; : Properties.Settings.Default.file; 

Con semplice se la condizione, avrei scritto in modo semplice Mi piace:

if(fp!null) 
{ 
filename = fp; 
Properties.Settings.Default.filename; 
Properties.Settings.Default.Save(); 
} 
else 
{ 
filename = Properties.Settings.Default.file 
} 

Qual è un modo dolce e semplice per scrivere usando l'operatore ternario sopra?

+1

Mi piace il modo if/else in questo caso - molto più facile da leggere IMHO ... – assylias

+3

Unario significa "con un operando". '? : 'ha * tre * operandi - è un operatore * ternario * e il suo nome è l'operatore condizionale. –

risposta

14

Perché non è possibile eseguire tre operazioni tra? e:

Perché questi sono operandi, che sono espressioni . Ogni espressione valuta un valore; vuoi più dichiarazioni. Da Eric Lippert blog post about foreach vs ForEach:

Il primo motivo è che ciò viola i principi di programmazione funzionale su cui si basano tutti gli altri operatori di sequenza. Chiaramente l'unico scopo di una chiamata a questo metodo è di causare effetti collaterali.

Lo scopo di un'espressione è calcolare un valore, non causare un effetto collaterale. Lo scopo di una dichiarazione è di provocare un effetto collaterale. Il sito di chiamata di questa cosa apparirebbe un lotto terribile come un'espressione (anche se, bisogna ammetterlo, dal momento che il metodo è vuoto-ritorno, l'espressione potrebbe essere utilizzato solo in un contesto “espressione istruzione”.)

Si dovrebbe scrivilo assolutamente usando un blocco if. È più chiaro

Se davvero, davvero desidera utilizzare l'operatore condizionale per questo, si potrebbe scrivere:

// Please, please don't use this. 
Func<string> x =() => { 
    Properties.Settings.Default.filename = fp; 
    Properties.Settings.Default.Save(); 
    return fp; 
}; 

string filename = fp == null ? Properties.Settings.Default.file : x(); 
+1

Perché non dichiarare la funzione anonimamente inline (joke) – Jodrell

2

Se davvero, vuole veramente, è possibile utilizzare una funzione che ha side effects:

filename = (fp!=null) ? DoOneThing(...) : DoAnotherThing(...); 

Anche se chi mantiene il tuo codice non ti ringrazierà.

3

L'operatore condizionale, che è un operatore ternario (non un operatore unario), non sostituisce l'istruzione if. È un operatore che restituisce uno dei due risultati. Mentre è possibile collegare in una certa misura questo:

var result = someBool ? "a" : (otherBool ? "b" : "c"); 

Questo diventa un po 'difficile da leggere. Inoltre, stai cercando di chiamare la funzione Save(), che non restituisce un risultato, quindi non puoi usarlo con questo operatore.

1

Risposta breve, utilizzare un blocco if, è l'unica cosa sensata da fare.

Un'altra risposta, per l'individuo sporco, puzzolente.

filename = (fp!=null) ? Func<string> {fp = Properties.Settings.Default.filename; Properties.Settings.Default.Save; return fp;} : Properties.Settings.Default.file; 
2

Se questo è stato c si sarebbe OK grazie alla "comma operator":

int b; 
int a = (1==1) ? (b=6, somemethod(), 1) : (b=7, 2); 

Qui b verrà impostato su 6, si chiamerà somemethod e poi a è impostato su 1.

Per fortuna quella era una funzione su cui non era stato eseguito il porting, usare if..else è molto più chiaro.

Problemi correlati