2014-07-24 23 views
5

Io uso C#? operatore quando ho istruzioni if ​​che riguardano una riga e va tutto bene. Ma Diciamo che ho questo codice (utilizzando le istruzioni if-classici):? operatore senza altro-parte

if(someStatement) 
{ 
    someBool = true; //someBools value is unknown 
} 
else 
{ 
    //Do nothing 
} 

Ciò può essere ottenuto su un one-liner facendo:

someBool = (someStatement) ? true : someBool; 

Ma perché non riesco a fare qualcosa di simile this:

someBool = (someStatement) ? true : ; 
//or possibly 
someBool = (someStatement) ? true; 

È possibile in qualche modo? Se lo è, c'è qualche vantaggio nell'usare un metodo rispetto all'altro? E se no, perché non dovresti essere in grado di farlo?

+0

Cosa ti aspetti dalle espressioni '(someStatement)? true: 'and' (someStatement)? vero? valutare? –

+0

@ O.R.Mapper true se someStatement è true e immutato se someStatement è false (questa domanda è puramente ipotetica, non è un problema valido) –

+0

Che cosa è * invariato *? L'espressione deve valutare un valore concreto, in questo caso, di tipo 'bool' - ovvero, 'true' o' false'. –

risposta

7

Si può fare:

someBool = (someStatement) ? true : someBool; 

non credo che le fa guadagnare un sacco di chiarezza su:

if (someStatement) 
{ 
    someBool = true; 
} 

ma sembra davvero essere una questione di gusti. Non direi che sia chiaramente negativo, ma il primo non è comune, quindi probabilmente lo eviterei.


chiedete perché non è possibile utilizzare l'operatore in questo modo:

someBool = (someStatement) ? true : ; 

questo sarebbe un cambiamento molto grande lingua! Tenete a mente che un incarico simile a questa:

<location> = <expression>; 

L'espressione viene valutata per dare un certo valore, e tale valore viene memorizzato in posizione. (A seconda che la posizione sia una variabile, proprietà, campo o indicizzazione, l'operazione di "memorizzazione" potrebbe essere molto diversa.)

Qui stai proponendo che il valore dell'espressione a destra, oltre al suo normale valori, può essere un valore di "non modifica", che ha il comportamento speciale che quando lo si utilizza in un'istruzione di assegnazione, non si verifica alcuna operazione di archiviazione. È diverso da qualsiasi altro valore normale e potenzialmente sorprendente.Ma cosa significherebbe se lo usassi in altri posti?

// Does this call DoSomething when cond is false? 
// If so, what value is passed to it? 
someObject.DoSomething(cond?x:); 

// What happens here if cond is false? Does it cancel 
// the entire assignment? 
int x = 77 + (cond?2:) * 3 - 4; 

// If cond is false, are methods F1 and F2 called or not called? 
int x = F1() + (cond?2:) + F2(); 

// What does this do? Does it skip the return if cond is false? 
return (cond?2:); 

penso che si può trovare estremamente difficile a venire con un comportamento sensibile, intuitiva e coerente per l'operatore in tutte queste circostanze, e non credo che sarebbe molto utile se non in una semplice assegnazione. Semplicemente non si adatta al resto della lingua, incluso renderebbe più difficile l'apprendimento, la lettura, la comprensione, l'implementazione e la spiegazione della lingua. Non ne vale la pena per un po 'di concisione.

+0

Ottima risposta! Sì, non avevo nemmeno pensato a come sarebbe stato implementato nella lingua –

10

In sostanza, si sta tentando di utilizzare l'operatore condizionale per qualcosa per cui non è stato progettato.

Non è pensato per opzionalmente prendere qualche azione ... ha lo scopo di valutare un'espressione o un'altra, e che è il risultato dell'espressione.

Se si desidera eseguire un'azione solo quando viene soddisfatta una condizione, utilizzare una dichiarazione if - è esattamente ciò che è lì per.

Nel tuo esempio, si potrebbe uso:

// Renamed someStatement to someCondition for clarity 
someBool |= someCondition; 

o

someBool = someCondition ? true : someBool; 

... in altre parole "utilizzare il valore esistente a meno che someCondition è vero ... ma personalmente, Penso che la dichiarazione originale if sia più chiara.

+0

pessimo:/personalmente penso che l'operatore condizionale sia più bello. –

+0

@JohanHjalmarsson: guarda la mia modifica per come potresti * usarla - ma in realtà, è pensata per valutare un'espressione. Ricorda che è solo un'espressione, * non * un'affermazione. –

+0

sì, lo so, l'opzione seccond è quello che uso. Era solo curioso se ci fosse un altro modo oltre a quello e una normale istruzione if –