Domanda

Ho guardato un po 'intorno e non ho trovato una domanda equivalente.
È questa pratica di codifica male? Posso leggere facilmente, ma è troppo criptico per qualcuno la lettura del codice?

bool? testBool = null;  
string result;  
result = (testBool ?? false ? "Yes" : "No");  

Modifica Le mie scuse a tutti per un certo codice orribile! Ecco un esempio di lavoro ..
Sono un po 'travolti dalla velocità delle risposte. Stavo per cancellare questo e farlo bene, ma già avuto 4 risposte!

È stato utile?

Soluzione

mi piacerebbe aggiungere parentesi in modo da chiarire che cosa sta succedendo -. Vale a dire

bool? testbool = null;
string result;
result = (testbool ?? false) ? "Yes" : "No";

Con questo, mi sarebbe stato bene con esso. Senza di essa, ho dovuto studiare per un po 'per capire cosa stava succedendo (se si compila anche - non so l'ordine delle operazioni fuori dalla parte superiore della mia testa per:? Vs. ??)

Altri suggerimenti

E 'un po' sul lato criptico, non è nemmeno chiaro se l'espressione è valutata come:

string result = (testbool ?? false) ? "Yes" : "No";

o

string result = testbool ?? (false ? "Yes" : "No");

È possibile utilizzare il metodo GetValueOrDefault del tipo nullable anziché l'operatore ?? per renderlo più leggibile:

bool? testbool = null;
string result = (testbool.GetValueOrDefault(false) ? "Yes" : "No");

EDIT: La domanda iniziale ha utilizzato un int?. E 'stato ora risolto.

Questo codice non sarà nemmeno la compilazione, quindi sì, direi che sia troppo criptico.

Errori di battitura a parte, il fatto che hai postato senza facilmente macchia che c'è un problema (si sta cercando di usare un bool sul RHS del ??, quando il LHS è un int?) suggerisce che non è una buona idea, anche quando lo fanno bene.

avrei bisogno di vedere un esempio reale, ma penso che avrei di solito diviso questo in una dichiarazione utilizzando l'operatore null coalescenza, e poi un altro utilizzando l'operatore condizionale. Un altro è quello di utilizzare il comportamento dei tipi nullable nei confronti di operatori ... ma ancora una volta, questo è ragionevolmente oscura. (Ho appena dovuto ricordare a me stesso esattamente ciò che il comportamento è!)

Mi piace l'operatore null coalescenza in generale, ma penso che la combinazione con l'operatore condizionale rende solo un po 'di oscurare. Penso che avrei probabilmente l'accetto nel caso in cui ci fosse un beneficio significativo al fatto che è una singola espressione (ad esempio per l'inizializzazione in cui l'alternativa è l'introduzione di un metodo in più), ma in generale preferisco dividerlo in due dichiarazioni.

EDIT: Un'alternativa in questo caso particolare è quello di confrontare solo contro "vera" - che sembra ridondante, ma non è nel caso di bool?:

result = (testBool == true) ? "Yes" : "No";

Le parentesi non sono necessari, ovviamente, ma aggiungono chiarezza IMO.

Credo che questo è più semplice: il risultato è solo "Sì" se testBool è effettivamente vero; altrimenti è "No". Se si voleva "default" Sì, devi scrivere:

result = (testBool == false) ? "No" : "Yes";

Avvolgere e penso che va bene.

string result = (testbool ?? false) ? "Yes" : "No";

In caso contrario, l'ordine previsto delle operazioni, anche se funziona, non è ovvio.

(Edit:. Jonathan mi ha battuto con un pizzico)

Non dovrebbe essere

bool? testbool = null;

Non trovo nessuna necessità di utilizzare un annullabile qui. Questo mi fa pensare due volte, quindi mi piacerebbe davvero codificare come

bool testbool = false;
string result;
result = testbool ? "Yes" : "No";

Non so se il vostro esempio era incompleta, ma penso che l'inizializzazione della variabile per il valore di default è più sano rispetto all'utilizzo di un annullabile e poi il ?? all'operatore di impostare il valore dopo la dichiarazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top