Pregunta

He buscado un poco y no he encontrado una pregunta equivalente.
¿Es esta mala práctica de codificación? Puedo leer con facilidad, pero es demasiado críptica para alguien que lee el código?

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

Editar: Mis disculpas a todos por algún código horrible! Aquí está un ejemplo de trabajo ..
Estoy un poco abrumado por la velocidad de las respuestas. Iba a eliminar esto y hacerlo bien, pero ya tenía 4 respuestas!

¿Fue útil?

Solución

Yo añadiría parens por lo aclaran lo que está pasando -. Es decir,

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

Con eso, estaría bien con él. Sin ella, tuve que estudiarlo un poco para averiguar lo que estaba pasando (si es que se compila - No sé el orden de las operaciones de la parte superior de mi cabeza para:? Vs. ??)

Otros consejos

Es un poco en el lado críptica, ni siquiera es obvio si la expresión se evalúa como:

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

o

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

Puede utilizar el método GetValueOrDefault del tipo anulable en lugar del operador ?? para que sea más legible:

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

EDIT: La pregunta original utilizó un int?. Ahora se ha fijado.

Ese código ni siquiera compilar, así que sí, yo diría que es demasiado críptica.

Los errores tipográficos un lado, el hecho de que usted envió fácilmente sin manchado que hay un problema (que está tratando de utilizar un bool en el lado derecho de la ??, cuando el LHS es un int?) sugiere que no es una buena idea, incluso cuando se hace bien.

que iba a necesitar para ver un ejemplo del mundo real, pero creo que será general dividirla en una declaración usando el operador coalescente nula, y luego otro con el operador condicional. Otro opción es utilizar el comportamiento de los tipos anulables en relación con los operadores ... pero de nuevo, eso es razonablemente oscura. (Solo he tenido que recordarme a mí mismo exactamente lo que el comportamiento es!)

Me gusta el operador coalescente nula en general, pero creo que la combinación con el operador condicional sólo hace que sea un poco para oscurecer. Creo que probablemente lo aceptaría en un caso en el que hubo un beneficio significativo para que sea una sola expresión (por ejemplo, para la inicialización donde la alternativa es la introducción de un método adicional) pero en general yo preferiría que dividirlo en dos declaraciones.

EDIT: Una alternativa en este caso particular es simplemente comparar contra el "verdadero" - que parece redundante, pero no es en el caso de bool?:

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

Los paréntesis no son necesarios, por supuesto, pero añaden claridad de la OMI.

Creo que esto es más simple: el resultado sólo es "Sí" si testBool es realmente cierto; de lo contrario es "No". Si quería "default" en Sí, iba a escribir:

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

Lo envuelve y yo creo que está bien.

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

De lo contrario el orden previsto de operaciones, incluso si funciona, no es obvia.

(Editar:. Jonathan me ganó por un pellizco)

¿No debería ser

bool? testbool = null;

No encuentro ninguna necesidad de utilizar un anulable aquí. Esto me hace pensar dos veces, por lo que realmente había codificar como

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

No sé si su ejemplo fue incompleta, pero creo que la inicialización de la variable con el valor por defecto es más cuerdo que el uso de un anulable y luego el ?? operador fijar el valor después de la declaración.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top