¿Cuáles son las ventajas y desventajas del operador?: En contraposición a la declaración estándar if-else. Los obvios son:
Condicional?: Operador
- Más corto y conciso cuando se trata de asignaciones y comparaciones de valores directos
- No parece ser tan flexible como el constructo if / else
Estándar If / Else
- Puede aplicarse a más situaciones (como llamadas a funciones)
- A menudo son innecesariamente largas
La legibilidad parece variar para cada uno dependiendo de la declaración. Durante un tiempo, después de haber estado expuesto por primera vez al operador?:, Me tomó un tiempo digerir exactamente cómo funcionaba. ¿Recomendaría usarlo siempre que sea posible, o ceñirse a if / else dado que trabajo con muchos no programadores?
c#
conditional-operator
KChaloux
fuente
fuente
SomeCheck() ? DoFirstThing() : DoSecondThing();
tiene que usar la expresión para devolver un valor.Respuestas:
Básicamente, recomendaría usarlo solo cuando la declaración resultante sea extremadamente corta y represente un aumento significativo en la concisión sobre el equivalente if / else sin sacrificar la legibilidad.
Buen ejemplo:
Mal ejemplo:
fuente
return
ser parte del resultado de la operación ternaria. Por ejemplo:check() ? return 1 : return 0;
no funcionará, peroreturn check() ? 1 : 0;
sí. Siempre es divertido encontrar estas pequeñas peculiaridades en la programación.Esto está prácticamente cubierto por las otras respuestas, pero "es una expresión" realmente no explica por qué es tan útil ...
En lenguajes como C ++ y C #, puede definir campos de solo lectura locales (dentro del cuerpo de un método) usándolos. Esto no es posible con una declaración if / then convencional porque el valor de un campo de solo lectura debe asignarse dentro de esa declaración única:
no es lo mismo que:
De manera similar, puede incrustar una expresión terciaria en otro código. Además de hacer que el código fuente sea más compacto (y en algunos casos más legible como resultado), también puede hacer que el código máquina generado sea más compacto y eficiente:
... puede generar menos código que tener que llamar al mismo método dos veces:
Por supuesto, también es una forma más conveniente y concisa (menos escritura, menos repetición y puede reducir la posibilidad de errores si tiene que duplicar fragmentos de código en un if / else). En casos limpios de "patrón común" como este:
... es simplemente más rápido de leer / analizar / comprender (una vez que esté acostumbrado) que el equivalente if / else de largo aliento, por lo que puede ayudarlo a 'asimilar' el código más rápido.
Por supuesto, el hecho de que sea útil no significa que sea lo mejor para usar en todos los casos. Aconsejaría usarlo solo para fragmentos cortos de código donde el significado es claro (o se aclara más) al usarlo
?:
: si lo usa en un código más complejo, o anida operadores ternarios entre sí, puede hacer que el código sea terriblemente difícil de leer .fuente
const
es constante, es decir, no se puede cambiar después de que se haya ejecutado la sentencia en la que se declaró.readonly
? Siempre pensé queconst
significaba " resuelto en tiempo de compilación y alineado donde sea que se use ".Por lo general, elijo un operador ternario cuando, de lo contrario, tendría mucho código duplicado.
Con un operador ternario, esto se podría lograr con lo siguiente.
fuente
aVal = a > 0 ? a : -a; answer = compute(aVal,b,c,d,e);
todo sib
,c
,d
ye
requiere tratamiento demasiado.compute(...)
esa > 0 ? a : -1
, que se evalúa por separado de los otros argumentos separados por comas. De todos modos, desafortunadamente C ++ carece de la notación que plantea su pregunta para manejar "tuplas" de valores separados por comas, por lo que inclusoa > 0 ? (a, b, c, d, e) : (-a, b, c, d, e)
es ilegal y no hay nada muy similar que funcione sin cambios encompute
sí mismo.Lo encuentro particularmente útil cuando hago desarrollo web si quiero establecer una variable en un valor enviado en la solicitud si está definido o en algún valor predeterminado si no lo está.
fuente
Un uso realmente genial es:
fuente
foo
es falso, entonces todo se evaluará a 4 sin hacer las otras pruebas.El operador condicional es ideal para condiciones breves, como esta:
Lo uso de vez en cuando porque toma menos tiempo escribir algo de esa manera ... desafortunadamente, esta ramificación a veces puede ser pasada por alto por otro desarrollador que navega por su código. Además, el código no suele ser tan corto, por lo que suelo ayudar a la legibilidad poniendo el? y: en líneas separadas, como esta:
Sin embargo, la gran ventaja de usar bloques if / else (y por qué los prefiero) es que es más fácil entrar más tarde y agregar algo de lógica adicional a la rama,
o agregue otra condición:
Entonces, al final, se trata de conveniencia para usted ahora (más corto de usar:?) Versus conveniencia para usted (y otros) más adelante. Es una cuestión de criterio ... pero como todos los demás problemas de formato de código, la única regla real es ser coherente y ser visualmente cortés con quienes tienen que mantener (¡o calificar!) Su código.
(todo el código compilado a ojo)
fuente
Una cosa que hay que reconocer cuando se usa el operador ternario es que es una expresión, no una declaración.
En lenguajes funcionales como el esquema, la distinción no existe:
(si (> ab) ab)
Condicional?: Operador "No parece ser tan flexible como la construcción if / else"
En lenguajes funcionales lo es.
Al programar en lenguajes imperativos, aplico el operador ternario en situaciones en las que normalmente usaría expresiones (asignación, declaraciones condicionales, etc.).
fuente
Si bien las respuestas anteriores son válidas y estoy de acuerdo con que la legibilidad es importante, hay 2 puntos más a considerar:
Esto hace que sea particularmente conciso el uso del ternario:
Si tiene tipos
T1
yT2
ambos pueden convertirse implícitamente aT
, entonces lo siguiente no funciona:(porque el compilador intenta determinar el tipo de expresión ternaria y no hay conversión entre
T1
yT2
).Por otro lado, la
if/else
versión siguiente funciona:porque
T1
se convierte ayT
tambiénT2
fuente
A veces, puede hacer que la asignación de un valor bool sea más fácil de leer a primera vista:
fuente
Si estoy estableciendo un valor y sé que siempre será una línea de código para hacerlo, normalmente uso el operador ternario (condicional). Si existe la posibilidad de que mi código y mi lógica cambien en el futuro, uso un if / else ya que es más claro para otros programadores.
De mayor interés para usted puede ser el ?? operador .
fuente
La ventaja del operador condicional es que es un operador. En otras palabras, devuelve un valor. Dado que
if
es una declaración, no puede devolver un valor.fuente
Recomendaría limitar el uso del operador ternario (? :) a una simple asignación de una sola línea lógica if / else. Algo parecido a este patrón:
Se puede convertir fácilmente a:
Evitaría usar el operador ternario en situaciones que requieran if / else if / else, anidado if / else, o if / else rama lógica que da como resultado la evaluación de múltiples líneas. La aplicación del operador ternario en estas situaciones probablemente resultaría en un código ilegible, confuso e inmanejable. Espero que esto ayude.
fuente
Hay algún beneficio de rendimiento al usar el? operador en, por ejemplo. MS Visual C ++, pero esto es realmente una cosa específica del compilador. El compilador puede optimizar la rama condicional en algunos casos.
fuente
El escenario que más me encuentro usándolo es para valores predeterminados y especialmente en devoluciones
Esos son realmente los únicos lugares en los que me parece agradable, pero para ellos sí.
Aunque si está buscando un booleano, esto a veces puede parecer algo apropiado para hacer:
Porque es muy fácil de leer y entender, pero esa idea siempre debe descartarse por lo más obvio:
fuente
Si necesita varias ramas en la misma condición, use un if:
Si necesita varias ramas con diferentes condiciones, entonces, si el recuento de declaraciones aumentaría, querrá usar el ternario:
Además, puede utilizar el operador ternario en la inicialización.
Hacer eso con if es muy complicado:
No puede poner la inicialización dentro de if / else, porque cambia el alcance. Pero las referencias y las variables const solo se pueden vincular en la inicialización.
fuente
El operador ternario puede incluirse dentro de un rvalue, mientras que un if-then-else no puede; por otro lado, un if-then-else puede ejecutar bucles y otras declaraciones, mientras que el operador ternario solo puede ejecutar (posiblemente anular) rvalues.
En una nota relacionada, && y || Los operadores permiten algunos patrones de ejecución que son más difíciles de implementar con if-then-else. Por ejemplo, si uno tiene varias funciones para llamar y desea ejecutar un fragmento de código si alguna de ellas falla, se puede hacer muy bien usando el operador &&. Hacerlo sin ese operador requerirá un código redundante, un goto o una variable de bandera adicional.
fuente
Con C # 7 , puede usar la nueva característica de locales de referencia para simplificar la asignación condicional de variables compatibles con ref. Así que ahora, no solo puedes hacer:
... pero también lo extremadamente maravilloso:
Esa línea de código asigna el valor de
a
ab
oc
, según el valor dei
.Notas
1. El valor r es el lado derecho de una asignación, el valor que se asigna.
2. El valor l es el lado izquierdo de una asignación, la variable que recibe el valor asignado.
fuente