2012-01-21 11 views
6

Ho una funzione con più se di (QUESTO NON E 'il codice effettivo)C#:? Espressione

if(n == 1) 
    m = 1; 
if(n == 2) 
    m = 2; 
if(n == 3) 
    m = 3; 

Invece di che ho voluto fare tutto fare in:? Espressione:

(n == 1) ? m = 1; 

Ma si dice che la sua attesa di un ':'

mi è familiare con il:? espressione da C++, dove si può semplicemente scrivere:

0.123.
(n == 1) ? m = 1 : 0; 

Ma 0 non ci vuole qui. Questa è una domanda ridicola e non riesco nemmeno a trovare una risposta in google poiché ignora "?:" Come una parola.

ANSWER: peccato che la risposta fosse nei commenti. Non c'è modo di "non fare nulla" in questa espressione e dovrei usare if-else o switch. Grazie.

+5

Perché non 'm = n'? – Pubby

+0

Sì, è difficile per Google un punto interrogativo. Questo è chiamato operatore ternario. – DOK

+8

Un'istruzione "if" * esegue un'istruzione se viene soddisfatta una condizione *. Un'espressione condizionale * sceglie un'espressione per valutare se una condizione è soddisfatta *, e in C# deve * fare qualcosa con quell'espressione *. (A differenza di C++, dove l'espressione può essere eseguita per i suoi effetti collaterali.) Stai mescolando i due stili insieme in un modo strano; non farlo Di solito è impossibile, e quando è possibile, è molto confuso. Usa un interruttore o un if-else; questo è molto più leggibile. –

risposta

2

in cerca di operatore ternario in C# fornirà risultati pertinenti.

un esempio d'uso potrebbe essere

var m = n == 1 ? 1 : 0 
+2

L'operatore condizionale '?:' È un operatore ternario, poiché accetta tre parametri. Non lo chiamerei * l'operatore * ternario, anche se C# attualmente ne ha solo uno. – CodesInChaos

+1

Penso che questo dovrebbe essere un commento. – CodesInChaos

+0

Suggerisco * operatore condizionale ternario *. – Pubby

14

Sembra che stai cercando:

m = (n == 1) ? 1 : 0; 

che si poteva poi a cascata a:

m = (n == 1) ? 1 : (n == 2) ? 2 : (n == 3) ? 3 : 0; 

Un importante (a me, comunque), a parte:

Perché stai chiedendo questo? Se è perché pensi che questo modulo sarà più efficiente di una serie di istruzioni if o switch, non. Il compilatore C# e il compilatore JIT .net sono davvero abbastanza intelligenti e trasformeranno il tuo codice (si spera!) Nella sua forma più ottimale. Scrivi il tuo codice in modo che sia comprensibile come o lo sviluppatore che deve mantenerlo dopo averlo come può essere. Se le prestazioni ottenute non sono accettabili, provare a modificarle ma misurare per determinare ciò che funziona meglio (tenendo presente che i nuovi compilatori/.net framework potrebbero cambiare ciò che accade).

+0

Wow, non mi rendevo conto che potevi incatenarli insieme. – DOK

+7

@DOK: è possibile, non significa che non rende altro che un codice orribilmente non leggibile! ; =) – Rob

+0

@Rob [Non deve essere] (http://pastebin.com/0kHXD1Hd). Non sono sicuro che C# abbia '# define', ma è quello che faccio in C/C++. – Pubby

1

Si potrebbe scrivere:

m = (n==1) ? 1 : m; 

Ma IMO questo è più difficile da leggere e più brutto rispetto al codice originale.

(n == 1) ? m = 1 : 0; 

Questo non è consentito perché C# non consente espressioni arbitrarie come un'istruzione. Il metodo chiama e assegnazioni sono permessi, la maggior parte delle altre espressioni non lo sono.

Un'istruzione viene eseguita per i suoi effetti collaterali, un'espressione per il suo valore. Quindi è naturale che la parte più esterna di una dichiarazione abbia un effetto collaterale. ?: non ha mai un effetto collaterale, quindi non è consentito come dichiarazione.

1

Si desidera che questo:

m = (n == 1) ? 1 : 0;

Per nidificare loro tutto sarebbe simile a questa:

m = (n == 1) ? 1 : (n == 2) ? 2 : (n == 3) ? 3 : 0;

Ma come si può vedere, questo è davvero molto meno facile da leggi e capisci. Può essere d'aiuto aggiungere una parentesi in più, ma penso che sia meglio usare un albero if-else.

1
m = (n == 1) ? 1 : m 

Mezzi

M è uguale a 1 quando n == 1, altrimenti m

proposito il ? è chiamato l'operatore Ternery. Trova utilizzo on MSDN

Con i migliori saluti,

0

provare questo:

m = (n == 1) ? 1 : 0; 
2

Forse:

m = (n == 1) ? 1 : (n == 2) ? 2 : (n == 3) ? 3 : m; 

o

m = n 

Ed IT: semplificata:

variable2 = (variable1 == value) ? 
      variable1 : 
      variable2; 
+0

+1 per 'm = n'. Codice ottimizzato: P –

+0

Seriamente? È un esempio – user779444

+0

@ user779444 Non è un buon esempio. Ed è abbastanza facile capire come farlo dalla mia risposta. –

0

Questo non è un problema da risolvere con un ternario se/operatore altro - è chiaramente un candidato ideale per un'istruzione switch (e l'utilizzo di un interruttore è probabile che sia molto più efficiente rispetto all'utilizzo di una sequenza di operatori ternari)

Se si desidera traslitterare un'istruzione if in:?, quindi è abbastanza semplice:

if ({condition}) {then-code}; else {else-code}; 

diventa

{condition} ? {then-code} : {else-code}; 

L'unica limitazione è che il codice then/else è una singola istruzione.

Il vantaggio principale di?: (Con i moderni compilatori) è che può essere incorporato in un'istruzione per comprimere significativamente il codice sorgente - a volte questo può essere di aiuto per la leggibilità, e talvolta serve solo a offuscare il significato del codice - usalo con cura

Problemi correlati