unario - para que se usa el en c#
Beneficios de usar el operador condicional?:(Ternario) (16)
¿Cuáles son los beneficios y desventajas del operador?: A diferencia de la declaración if-else estándar. Los más obvios son:
Condicional ?: Operador
- Más breve y más conciso cuando se trata de comparaciones y asignaciones de valores directos
- No parece ser tan flexible como el constructo if / else
Estándar If / Else
- Se puede aplicar a más situaciones (como llamadas a funciones)
- A menudo son innecesariamente largos
La legibilidad parece variar para cada uno dependiendo de la declaración. Por un tiempo después de haber estado expuesto por primera vez al operador?: Me tomó algo de tiempo digerir exactamente cómo funcionó. ¿Recomendaría usarlo siempre que sea posible, o apegarse a if / else dado que trabajo con muchos no programadores?
¿Hay algún beneficio de rendimiento al usar el? operador en, por ej. MS Visual C ++, pero esto es realmente algo específico del compilador. El compilador en realidad puede optimizar la rama condicional en algunos casos.
A veces puede hacer que la asignación de un valor bool sea más fácil de leer a primera vista:
// With
button.IsEnabled = someControl.HasError ? false : true;
// Without
button.IsEnabled = !someControl.HasError;
Básicamente, recomendaría usarlo solo cuando el enunciado resultante sea extremadamente corto y represente un aumento significativo en la concisión sobre el equivalente if / else sin sacrificar la legibilidad.
Buen ejemplo:
int result = Check() ? 1 : 0;
Mal ejemplo:
int result = FirstCheck() ? 1 : SecondCheck() ? 1 : ThirdCheck() ? 1 : 0;
El escenario que más utilizo es el de los valores predeterminados y, especialmente, los retornos
return someIndex < maxIndex ? someIndex : maxIndex;
Esos son realmente los únicos lugares en los que me parece agradable, pero para ellos lo hago.
Sin embargo, si está buscando un booleano, a veces puede parecer lo más apropiado:
bool hey = whatever < whatever_else ? true : false;
Porque es muy fácil de leer y entender, pero esa idea siempre debe ser considerada más obvia:
bool hey = (whatever < whatever_else);
El operador condicional es ideal para condiciones cortas, como esta:
varA = boolB ? valC : valD;
Lo uso de vez en cuando porque toma menos tiempo escribir algo de esa manera ... desafortunadamente, esta ramificación a veces puede pasar desapercibida para otro desarrollador que navega sobre su código. Además, el código por lo general no es tan corto, así que generalmente ayudo a la legibilidad colocando el? y: en líneas separadas, como esta:
doSomeStuffToSomething(shouldSomethingBeDone()
? getTheThingThatNeedsStuffDone()
: getTheOtherThingThatNeedsStuffDone());
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 alguna lógica adicional a la rama,
if (shouldSomethingBeDone()) {
doSomeStuffToSomething(getTheThingThatNeedsStuffDone());
doSomeAdditionalStuff();
} else {
doSomeStuffToSomething(getTheOtherThingThatNeedsStuffDone());
}
o agrega otra condición:
if (shouldSomethingBeDone()) {
doSomeStuffToSomething(getTheThingThatNeedsStuffDone());
doSomeAdditionalStuff();
} else if (shouldThisOtherThingBeDone()){
doSomeStuffToSomething(getTheOtherThingThatNeedsStuffDone());
}
Entonces, al final, se trata de conveniencia para usted ahora (más corto de usar:?) Frente a la conveniencia para usted (y otros) más adelante. Es una decisión acertada ... pero, al igual que todos los demás problemas de formato de código, la única regla real es ser coherente y ser cortés con las personas que tienen que mantener (¡o calificar!) Su código.
(todo el código compilado)
El operador ternario puede incluirse dentro de un valor r, mientras que un if-entonces-else no puede; por otro lado, un if-then-else puede ejecutar bucles y otras instrucciones, mientras que el operador ternario solo puede ejecutar valores (posiblemente anulados).
En una nota relacionada, el && 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 alguno de ellos falla, puede hacerlo bien utilizando el operador &&. Hacerlo sin ese operador requerirá código redundante, un goto o una variable de bandera adicional.
Encuentro particularmente útil cuando realizo el desarrollo web si quiero establecer una variable a un valor enviado en la solicitud si está definida o a algún valor predeterminado si no lo está.
Esto está prácticamente cubierto por las otras respuestas, pero "es una expresión" realmente no explica por qué es tan útil ...
En idiomas como C ++ y C #, puede definir constantes locales (dentro de un cuerpo de método) usándolos. Esto no es posible con una sentencia if / then convencional porque el valor de una const all debe asignarse dentro de esa sola instrucción:
const int speed = (shiftKeyDown) ? 10 : 1;
no es lo mismo que:
const int speed;
if (shifKeyDown)
speed = 10; // error - can''t assign to a const
else
speed = 1; // error
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 de máquina generado sea más compacto y eficiente:
MoveCar((shiftKeyDown) ? 10 : 1);
... puede generar menos código que tener que llamar al mismo método dos veces:
if (shiftKeyDown)
MoveCar(10);
else
MoveCar(1);
Por supuesto, también es una forma más conveniente y concisa (menos tipeo, menos repetición y puede reducir la posibilidad de errores si tiene que duplicar trozos de código en un if / else). En casos limpios de "patrón común" como este:
object thing = (reference == null) ? null : reference.Thing;
... es simplemente más rápido leer / analizar / entender (una vez que estás acostumbrado) que el largo tiempo sintonizado equivalente, por lo que puede ayudarte a ''asimilar'' el código más rápido.
Por supuesto, solo porque sea útil no significa que sea lo mejor para usar en todos los casos. Aconsejo usarlo solamente para fragmentos cortos de código donde el significado es claro (o se hace más claro) usando ?:
- si lo usa en código más complejo, o anida operadores ternarios entre sí, puede hacer que el código sea terriblemente difícil leer.
La ventaja del operador condicional es que es un operador. En otras palabras, devuelve un valor. Como if
es una declaración, no puede devolver un valor.
Por lo general, elijo un operador ternario cuando tengo mucho código duplicado de lo contrario.
if (a > 0)
answer = compute(a, b, c, d, e);
else
answer = compute(-a, b, c, d, e);
Con un operador ternario, esto podría lograrse con lo siguiente.
answer = compute(a > 0 ? a : -a, b, c, d, e);
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:
- En C # 6, puede tener métodos con cuerpo de expresión.
Esto lo hace particularmente conciso para usar el ternario:
string GetDrink(DayOfWeek day)
=> day == DayOfWeek.Friday
? "Beer" : "Tea";
- El comportamiento difiere cuando se trata de conversión de tipo implícito.
Si tiene los tipos T1
y T2
que se pueden convertir implícitamente a T
, lo siguiente no funciona:
T GetT() => true ? new T1() : new T2();
(porque el compilador intenta determinar el tipo de expresión ternaria y no hay conversión entre T1
y T2
).
Por otro lado, la siguiente versión if/else
funciona:
T GetT()
{
if (true) return new T1();
return new T2();
}
porque T1
se convierte en T
y también lo es T2
Si estoy estableciendo un valor y sé que siempre habrá una línea de código para hacerlo, normalmente utilizo el operador ternario (condicional). Si existe la posibilidad de que mi código y lógica cambien en el futuro, uso un if / else ya que es más claro para otros programadores.
Si necesita varias ramas en la misma condición, use un if:
if (A == 6)
f(1, 2, 3);
else
f(4, 5, 6);
Si necesita ramas múltiples con diferentes condiciones, entonces si el recuento de las afirmaciones creciera como una bola de nieve, querrá usar el ternario:
f( (A == 6)? 1: 4, (B == 6)? 2: 5, (C == 6)? 3: 6 );
Además, puede usar el operador ternario en la inicialización.
const int i = (A == 6)? 1 : 4;
Hacer eso con si es muy desordenado:
int i_temp;
if (A == 6)
i_temp = 1;
else
i_temp = 4;
const int i = i_temp;
No puede poner la inicialización dentro de if / else, porque cambia el alcance. Pero las referencias y las variables const solo pueden vincularse en la inicialización.
Un uso realmente genial es:
x = foo ? 1 :
bar ? 2 :
baz ? 3 :
4;
Una cosa para reconocer al usar 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)
Conditional?: Operator "No parece ser tan flexible como el constructo if / else"
En lenguajes funcionales es.
Cuando programo en lenguajes imperativos, aplico el operador ternario en situaciones en las que típicamente usaría expresiones (asignación, declaraciones condicionales, etc.).
Yo recomendaría limitar el uso del operador ternario (? :) a la simple asignación de línea simple si / else lógica. Algo parecido a este patrón:
if(<boolCondition>) {
<variable> = <value>;
}
else {
<variable> = <anotherValue>;
}
Podría convertirse fácilmente en:
<variable> = <boolCondition> ? <value> : <anotherValue>;
Evitaría usar el operador ternario en situaciones que requieren if / else if / else, anidado si / else, o si / else branch logic que da como resultado la evaluación de múltiples líneas. Aplicar el operador ternario en estas situaciones probablemente resulte en un código ilegible, confuso e inmanejable. Espero que esto ayude.